123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540 |
- <template>
- <view class="container">
- <page-title>月报录入</page-title>
- <view class="cards-list">
- <view class="card only-card">
- <!-- 项目名称 -->
- <view class="card-item first-card-item">
- <view class="card-item-name">项目名称</view>
- <view class="card-item-input">{{pageForm.subName || "--"}}</view>
- </view>
- <!-- 主体单位 -->
- <view class="card-item">
- <view class="card-item-name">主体单位</view>
- <view class="card-item-input">{{pageForm.UnitName || "--"}}</view>
- </view>
- <!-- 录入年月 -->
- <view class="card-item">
- <view class="card-item-name">录入年月</view>
- <view class="card-item-input">{{editMonth || "--"}}</view>
- </view>
- <!-- 当月实际投资 -->
- <view class="card-item">
- <view class="card-item-name" style="min-width: 192rpx;">当月实际投资</view>
- <view class="card-item-input" v-if="!beforeTime">暂不可填写 </view>
- <view class="card-item-name flex" v-else>
- <input type="number" v-model="pageForm.amt" class="card-item-input" placeholder="填写金额"
- placeholder-style="color: #D8D8D8" maxlength="20" :disabled="!checkedit || banSubmit" />
- <view class="card-item-unit">万元 </view>
- </view>
- </view>
- <!-- 当月入统资金 -->
- <view class="card-item">
- <view class="card-item-name" style="min-width: 192rpx;">当月入统资金</view>
- <view v-if="!beforeTime" class="card-item-input">暂不可填写 </view>
- <view v-else class="card-item-name flex">
- <input type="number" v-model="pageForm.amtRt" class="card-item-input" placeholder="填写金额"
- placeholder-style="color: #D8D8D8" maxlength="20" :disabled="!checkedit || banSubmit" />
- <view class="card-item-unit">万元 </view>
- </view>
- </view>
- <!-- 项目延期原因 -->
- <view class="card-item">
- <view class="card-item-name">项目延期原因</view>
- </view>
- <view class="card-item">
- <u--textarea class="card-item-textarea" v-model="pageForm.reason" :disabled="banSubmit"></u--textarea>
- </view>
- <!-- 进度 -->
- <view class="card-item">
- <view class="card-item-name">进度<span class="must-input">*</span></view>
- <view class="card-item-name flex">
- <input type="number" v-model="pageForm.numBl" class="card-item-input" placeholder="填写进度"
- placeholder-style="color: #D8D8D8" maxlength="20" :disabled="!checkedit || banSubmit" />
- <view class="card-item-unit">%</view>
- </view>
- </view>
- <!-- 当月完成内容 -->
- <view class="card-item">
- <view class="card-item-name">当月完成内容<span class="must-input">*</span></view>
- </view>
- <view class="card-item">
- <u--textarea class="card-item-textarea" v-model="pageForm.content"
- :disabled="!checkedit || banSubmit"></u--textarea>
- </view>
- <!-- 下月预测投资金额 -->
- <view class="card-item">
- <view class="card-item-name" style="min-width: 256rpx;">下月预测投资金额</view>
- <view class="card-item-name flex">
- <input type="number" v-model="pageForm.amtLast" class="card-item-input" placeholder="填写金额"
- placeholder-style="color: #D8D8D8" maxlength="20" :disabled="!checkedit || banSubmit" />
- <view class="card-item-unit" style="min-width: 128rpx;">(万元)</view>
- </view>
- </view>
- <!-- 附件(照片) -->
- <view class="card-item flex-align-start">
- <view class="card-item-name" style="min-width: 156rpx;">图片附件</view>
- <u-upload :fileList="uploadListPhoto" @afterRead="afterReadPhoto" @delete="delFilePhoto" name="file"
- uploadIcon="plus"></u-upload>
- </view>
- <!-- 附件(视频) -->
- <view class="card-item flex-align-start">
- <view class="card-item-name" style="min-width: 156rpx;">视频附件</view>
- <u-upload :fileList="uploadListVideo" @afterRead="afterReadVideo" @delete="delFileVideo"
- @onVideoClick="videoClick" name="file" uploadIcon="plus" accept="video"></u-upload>
- </view>
- <!-- 附件(文件) -->
- <view class="card-item flex-align-start">
- <view class="card-item-name" style="min-width: 156rpx;">其他附件</view>
- <view class="upload-file-area">
- <view class="upload-file-name" v-for="(item,index) in uploadListFile" :key="index"
- @click="showFile('pdf',item.url)">
- {{item.fileName}}
- </view>
- </view>
- </view>
- </view>
- <view v-if="checkedit" class="confirm-btn" :class="banSubmit?'ban-submit':''" @click="confirmParams()">确定</view>
- </view>
- </view>
- </template>
- <script setup>
- import config from '@/config.js'
- import {
- ref
- } from 'vue'
- import {
- onLoad
- } from "@dcloudio/uni-app"
- import {
- uploadFilePromise
- } from "@/utils/request_new.js"
- import {
- getMonthlyById,
- saveMonthly
- } from "@/api/work/weeklyAndMonthly.js"
- // 是否可编辑
- let checkedit = ref(false)
- // 是否可编辑月份
- let beforeTime = ref(true)
- // 正在编辑的月份
- let editMonth = ref(null)
- let pageForm = ref({
- year: null,
- beginDate: null,
- subId: null,
- subName: null,
- UnitName: null,
- amtRt: null,
- content: null,
- numBl: null,
- content: null,
- amtLast: null,
- reason: null,
- listFile: [],
- })
- let fileTypeCode = {
- 0: "dir",
- 1: "txt",
- 2: "doc",
- 3: "docx",
- 4: "xls",
- 5: "xlsx",
- 6: "ppt",
- 7: "pptx",
- 8: "pdf",
- 9: "swf",
- 101: "jpg",
- 102: "image",
- 103: "jpeg",
- 104: "bmp",
- 105: "gif",
- 201: "avi",
- 202: "wmv",
- 202: "flv",
- 203: "video"
- }
- // ====================获取数据
- function getMonthlyDetail(sendParams) {
- let beginDateTempY = sendParams.kj_month.replace("年", "-")
- let timeFormat = beginDateTempY.replace("月", "-") + "01"
- pageForm.value.beginDate = timeFormat;
- pageForm.value.year = sendParams.year;
- let params = {
- subId: sendParams.subId,
- startDate: timeFormat,
- year: sendParams.year,
- kjMonth: sendParams.kj_month
- }
- getMonthlyById(params).then(res => {
- checkedit.value = res.data.checkedit === "1";
- pageForm.value.subName = res.data.subName;
- pageForm.value.UnitName = res.data.UnitName;
- pageForm.value.subId = res.data.subId;
- pageForm.value.numBl = res.data.numBl;
- pageForm.value.amt = res.data.amt;
- pageForm.value.content = res.data.content;
- pageForm.value.amtLast = res.data.amtLast;
- pageForm.value.reason = res.data.reason;
- pageForm.value.amtRt = res.data.amtRt;
- judgeBeforeTime(res.data.check);
- conbineFileList(res.data.listFile);
- })
- }
- // 组合附件数据
- function conbineFileList(list) {
- // 添加上传成功标识
- const statusList = list.map(item => {
- let orginal = {
- ...item
- }
- return Object.assign(
- orginal, {
- status: 'success'
- })
- })
- // 照片附件
- let listPhoto = statusList.filter(item => ['101', '102', '103', '104', '105'].includes(item.fileType))
- uploadListPhoto.value = listPhoto
- // 视频附件
- let listVideo = statusList.filter(item => ['202', '203'].includes(item.fileType));
- uploadListVideo.value = listVideo;
- // 其他附件
- let exceptPhotoList = statusList.filter(item => !listPhoto.includes(item));
- uploadListFile.value = exceptPhotoList.filter(item => !listVideo.includes(item));
- // 上传数据
- const dataList = list.map(item => {
- let orginal = {
- ...item
- }
- return {
- id: orginal.id,
- fileName: orginal.fileName,
- fileType: orginal.fileType,
- fileAddre: orginal.fileAddre
- }
- })
- pageForm.value.listFile = dataList
- // 备份初始数据
- listFileOrginal = dataList
- }
- // 判断是否能填写金额
- function judgeBeforeTime(check) {
- // check 1 可以编辑,0不可编辑
- if (check === "0") {
- return beforeTime.value = false;
- }
- const D = new Date();
- // 比较月份
- let pageMonth = Number(editMonth.value.slice(5, 7));
- let month = D.getMonth() + 1;
- // 控制当月
- let day = D.getDate();
- if (pageMonth === month && day < 25) {
- return beforeTime.value = false;
- }
- beforeTime.value = true;
- }
- // ====================附件上传
- let listFileOrginal = [] //原始数据--备份比较用
- let uploadListPhoto = ref([]) //上传列表--图片
- let uploadListVideo = ref([]) //上传列表--视频
- let uploadListFile = ref([]) //上传列表--文件
- // 上传文件操作
- async function afterReadPhoto(event) {
- if (!checkedit.value) return uni.showToast({
- title: "无操作权限",
- icon: "error",
- duration: 2000
- })
- if (banSubmit.value) return
- let lists = [].concat(event.file); //文件内容
- let fileListLen = uploadListPhoto.value.length; //数量
- lists.map((item) => {
- uploadListPhoto.value.push({
- ...item,
- status: 'uploading',
- message: '上传中'
- })
- })
- for (let i = 0; i < lists.length; i++) {
- const resultObj = await uploadFilePromise(lists[i].url);
- // let resultObj = JSON.parse(result);
- let fileItem = {
- fileName: resultObj.data.resultList[0].name,
- fileType: resultObj.data.resultList[0].ftype,
- fileAddre: resultObj.data.resultList[0].id
- }
- pageForm.value.listFile.push(fileItem)
- // 上传地址
- const serverAddress = uni.getStorageSync("serverAddress");
- const baseUrlIp = serverAddress ? serverAddress : config.baseUrl;
- const preViewUrl = baseUrlIp + "/projects//static/file/";
- // =================取消上传中状态
- // 文件
- let item = uploadListPhoto.value[fileListLen]
- // 文件类型
- let type = fileTypeCode[resultObj.data.resultList[0].ftype]
- uploadListPhoto.value.splice(fileListLen, 1, Object.assign(item, {
- status: 'success',
- message: '',
- url: preViewUrl + resultObj.data.resultList[0].id + "/showfile",
- id: resultObj.data.resultList[0].id,
- preView: preViewUrl + resultObj.data.resultList[0].id + "/showfile",
- // type
- }))
- fileListLen++
- }
- }
- // 删除文件
- function delFilePhoto(event) {
- if (!checkedit.value) return uni.showToast({
- title: "无操作权限",
- icon: "error",
- duration: 2000
- })
- if (banSubmit.value) return
- // 从渲染列表里移除
- uploadListPhoto.value.splice(event.index, 1);
- // 从文件里删除或标记
- let delFileIndex = pageForm.value.listFile.findIndex(item => item.fileAddre === event.file.fileAddre || item
- .fileAddre ===
- event.file.id);
- let delFile = pageForm.value.listFile[delFileIndex];
- // 是否是已经上传的文件
- if (delFile && delFile.id) {
- // 已保存
- delFile.logicDeleteFlag = 1
- } else {
- pageForm.value.listFile.splice(delFileIndex, 1)
- }
- }
- // 上传文件操作--视频
- async function afterReadVideo(event) {
- if (!checkedit.value) return uni.showToast({
- title: "无操作权限",
- icon: "error",
- duration: 2000
- })
- if (banSubmit.value) return
- let lists = [].concat(event.file); //文件内容
- let fileListLen = uploadListVideo.value.length; //数量
- lists.map((item) => {
- uploadListVideo.value.push({
- ...item,
- status: 'uploading',
- message: '上传中'
- })
- })
- for (let i = 0; i < lists.length; i++) {
- const resultObj = await uploadFilePromise(lists[i].url);
- // let resultObj = JSON.parse(result);
- let fileItem = {
- fileName: resultObj.data.resultList[0].name,
- fileType: resultObj.data.resultList[0].ftype,
- fileAddre: resultObj.data.resultList[0].id
- }
- pageForm.value.listFile.push(fileItem)
- // 上传地址
- const serverAddress = uni.getStorageSync("serverAddress");
- const baseUrlIp = serverAddress ? serverAddress : config.baseUrl;
- const preViewUrl = baseUrlIp + "/projects//static/file/";
- // =================取消上传中状态
- // 文件
- let item = uploadListVideo.value[fileListLen]
- // 文件类型
- let type = fileTypeCode[resultObj.data.resultList[0].ftype]
- uploadListVideo.value.splice(fileListLen, 1, Object.assign(item, {
- status: 'success',
- message: '',
- url: preViewUrl + resultObj.data.resultList[0].id + "/showfile",
- id: resultObj.data.resultList[0].id,
- preView: preViewUrl + resultObj.data.resultList[0].id + "/showfile",
- // type
- }))
- fileListLen++
- }
- }
- // 删除文件--视频
- function delFileVideo(event) {
- if (!checkedit.value) return uni.showToast({
- title: "无操作权限",
- icon: "error",
- duration: 2000
- })
- if (banSubmit.value) return
- uploadListVideo.value.splice(event.index, 1);
- // 从文件里删除或标记
- let delFileIndex = pageForm.value.listFile.findIndex(item => item.fileAddre === event.file.fileAddre || item
- .fileAddre ===
- event.file.id);
- let delFile = pageForm.value.listFile[delFileIndex];
- // 是否是已经上传的文件
- if (delFile && delFile.id) {
- // 已保存
- delFile.logicDeleteFlag = 1
- } else {
- pageForm.value.listFile.splice(delFileIndex, 1)
- }
- }
- // 播放文件--视频
- function videoClick(event) {
- showFile(event.fileType, event.url)
- }
- // 文件预览
- function showFile(type, filePath) {
- uni.navigateTo({
- url: `/pages/projectInfo/media/index?type=${type}&filePath=${filePath}`
- })
- }
- // ====================提交数据
- let banSubmit = ref(false);
- let isSubmit = ref(false);
- function confirmParams() {
- // 禁止提交
- if (banSubmit.value || isSubmit.value) return;
- // 检查必填项
- if (((pageForm.value.numBl ?? '') === '') || ((pageForm.value.content ?? '') === '')) {
- return uni.showModal({
- title: '请检查',
- content: '进度与当月完成内容为必填项。',
- showCancel: false
- })
- }
- // 确认提交
- uni.showModal({
- title: "保存确认",
- content: "确定要保存该月报录入吗?",
- success: function(res) {
- if (res.confirm) {
- let params = Object.assign({}, pageForm.value);
- delete(params.UnitName);
- delete(params.subName);
- isSubmit.value = true;
- saveMonthly(params).then(res => {
- isSubmit.value = false;
- banSubmit.value = true;
- if (res.code === 200) {
- uni.showToast({
- title: "保存成功",
- icon: "success",
- duration: 2000
- })
- }
- }).catch(() => {
- isSubmit.value = false;
- uni.showToast({
- title: "保存失败",
- icon: "error",
- duration: 2000
- })
- })
- } else if (res.cancel) {
- uni.showToast({
- title: "取消保存",
- icon: "none",
- duration: 2000,
- })
- }
- },
- })
- }
- onLoad((options) => {
- editMonth.value = options.kj_month;
- getMonthlyDetail(options);
- if (options.amtRt) {
- pageForm.value.amtRt = options.amtRt;
- }
- })
- </script>
- <style lang="scss" scoped>
- .must-input {
- color: #f00;
- }
- </style>
|