Newer
Older
Nanping_sponge_GCGL / src / views / project / projectManagement / shangbao / tableDalgo.vue
@liyingjing liyingjing on 25 Oct 2023 19 KB 海绵工程管理
<template>
  <el-form
    label-width="auto"
    ref="ruleFormRef"
    :model="tableDate"
    class="demo-form-inline"
  >
    <el-row gutter="10">
      <el-divider content-position="left">基本信息</el-divider>
      <el-col :span="8">
        <el-form-item label="项目名称:" prop="projectName">
          <el-input
            disabled
            v-model="tableDate.projectName"
            placeholder="项目名称"
          />
        </el-form-item>
      </el-col>
      <el-col :span="8">
        <el-form-item label="项目编号:" prop="projectNo">
          <el-input
            disabled
            v-model="tableDate.projectNo"
            placeholder="项目编号"
          />
        </el-form-item>
      </el-col>
      <el-col :span="8">
        <el-form-item
          label="项目状态:"
          prop="buildStatus"
          :rules="[{ required: true, message: '项目状态', trigger: 'blur' }]"
        >
          <el-select
            @change="stateChange"
            clearable
            style="width: 100%"
            v-model="tableDate.buildStatus"
            placeholder="项目状态"
            size="mini"
          >
            <el-option
              v-for="item in build_status"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            />
          </el-select>
        </el-form-item>
      </el-col>
      <el-col :span="8">
        <el-form-item
          label="建设进度:"
          prop="totalProgress"
          :rules="[{ required: true, message: '建设进度', trigger: 'blur' }]"
        >
          <el-input v-model="tableDate.totalProgress" :min="0" :max="100">
            <template #append> % </template>
          </el-input>
        </el-form-item>
      </el-col>
      <el-col :span="8">
        <el-form-item
          label="当月完成项目总投资:"
          prop="monthInvest"
          :rules="[
            { required: true, message: '当月完成项目总投资', trigger: 'blur' },
          ]"
        >
          <el-input v-model="tableDate.monthInvest" :min="0" @input="monthInvestChange">
            <template #append> 万元 </template>
          </el-input>
        </el-form-item>
      </el-col>
      <el-col :span="8">
        <el-form-item
          label="当月完成海绵相关投资:"
          prop="monthSpongeInvest"
          :rules="[
            {
              required: true,
              message: '当月完成海绵相关投资',
              trigger: 'blur',
            },
          ]"
        >
          <el-input v-model="tableDate.monthSpongeInvest" :min="0" @input="monthSpongeInvestChange">
            <template #append> 万元 </template>
          </el-input>
        </el-form-item>
      </el-col>
      <el-col :span="8">
        <el-form-item
          label-width="auto"
          label="完成项目总投资:"
          :rules="[
            { required: true, message: '完成项目总投资', trigger: 'blur' },
          ]"
          prop="completeTotalInvest"
        >
          <el-input
            clearable
            v-model="tableDate.completeTotalInvest"
            placeholder="完成项目总投资"
            :min="0"
            :disabled="true"
          >
            <template #append> 万元 </template>
          </el-input>
        </el-form-item>
      </el-col>
      <el-col :span="8">
        <el-form-item
          label-width="auto"
          label="完成海绵相关投资:"
          :rules="[
            { required: true, message: '完成海绵相关投资', trigger: 'blur' },
          ]"
          prop="completeSpongeInvest"
        >
          <el-input
            clearable
            v-model="tableDate.completeSpongeInvest"
            placeholder="完成海绵相关投资"
            :min="0"
            :disabled="true"
          >
            <template #append> 万元 </template>
          </el-input>
        </el-form-item>
      </el-col>
      <el-col :span="24">
        <el-form-item label="补充说明:">
          <el-input
            type="textarea"
            v-model="tableDate.supplement"
            placeholder="补充说明"
          />
        </el-form-item>
      </el-col>
      <el-col :span="24">
        <el-form-item label="附件:" style="width: 93%">
          <el-upload
            v-model:file-list="fileList1"
            class="upload-demo"
            style="width: 100%"
            action="/prod-api/system/upload"
            :headers="uploadHeader"
            multiple
            :on-preview="handlePreview"
          >
            <el-button type="primary">选择文件</el-button>
            <template #tip>
              <div class="el-upload__tip">支持CSV格式,可一次性上传多个文件</div>
            </template>
          </el-upload>
        </el-form-item>
      </el-col>
      <el-divider content-position="left">进度汇报明细</el-divider>
      <el-form
        class="tableForm"
        ref="tableFormRef"
        :model="tableDate"
        :rules="tableRules"
      >
        <el-table
          :data="tableDate.projectPlanInventoryList"
          style="width: 100%"
          row-key="id"
          :tree-props="{ children }"
        >
          <el-table-column
            prop="nodeName"
            label="一级节点"
            width="180"
            align="center"
          />
          <el-table-column
            prop="planStartTime"
            label="计划开始日期"
            align="center"
            width="120"
          >
            <template #default="{ row }">
              {{ row.planStartTime.substring(0, 10) }}
            </template>
          </el-table-column>
          <el-table-column
            prop="planEndTime"
            label="计划结束日期"
            align="center"
            width="120"
          >
            <template #default="{ row }">
              {{ row.planEndTime.substring(0, 10) }}
            </template>
          </el-table-column>
          <el-table-column
            prop="actualFinishStartTime"
            align="center"
            width="160"
            label="完成开始日期"
          >
            <template #default="{ row }">
              <el-form-item
              :prop="'projectPlanInventoryList.' + findPosi(tableDate.projectPlanInventoryList, row.id) + '.actualFinishStartTime'"
                :rules="tableRules['actualFinishStartTime']"
              >
                <el-date-picker
                  style="width: 100%"
                  v-model="row.actualFinishStartTime"
                  type="date"
                  placeholder="开始日期"
                  format="YYYY-MM-DD"
                  value-format="YYYY-MM-DD"
                />
              </el-form-item>
            </template>
          </el-table-column>
          <el-table-column
            prop="actualFinishEndTime"
            align="center"
            width="160"
            label="完成结束日期"
          >
            <template #default="{ row }">
              <el-form-item
                :prop="'projectPlanInventoryList.' + findPosi(tableDate.projectPlanInventoryList, row.id) + '.actualFinishEndTime'"
                :rules="tableRules['actualFinishEndTime']"
              >
                <el-date-picker
                  style="width: 100%"
                  v-model="row.actualFinishEndTime"
                  type="date"
                  placeholder="结束日期"
                  format="YYYY-MM-DD"
                  value-format="YYYY-MM-DD"
                />
              </el-form-item>
            </template>
          </el-table-column>
          <el-table-column
            prop="workContent"
            align="center"
            width="170"
            label="工作内容"
          >
            <template #default="{ row }">
              <el-input
                v-model="row.workContent"
                type="textarea"
                placeholder="工作内容"
                :autosize="{ minRows: 1, maxRows: 3 }"
              />
            </template>
          </el-table-column>
          <el-table-column
            prop="estimatedWorkHours"
            label="预计工时H"
            align="center"
            width="160"
          >
            <template #default="{ row }">
              <el-input-number
                controls-position="right"
                :min="0"
                :precision="3"
                size="small"
                v-model.number="row.estimatedWorkHours"
                placeholder="预计工时"
                :disabled="true"
              />
            </template>
          </el-table-column>
          <el-table-column
            prop="manHour"
            label="工时H"
            align="center"
            width="160"
          >
            <template #default="{ row }">
              <el-input-number
                controls-position="right"
                :min="0"
                :precision="3"
                size="small"
                v-model.number="row.manHour"
                placeholder="工时"
              />
            </template>
          </el-table-column>
          <el-table-column
            prop="schedule"
            align="center"
            width="160"
            label="进度%"
          >
            <template #default="{ row }">
              <el-input-number
                controls-position="right"
                :min="0"
                :max="100"
                :precision="2"
                size="small"
                v-model.number="row.schedule"
                placeholder="进度"
              />
            </template>
          </el-table-column>
          <el-table-column
            prop="plannedFundsMonth"
            label="计划资金"
            align="center"
            width="160"
          >
            <template #default="{ row }">
              <el-input-number
                controls-position="right"
                :min="0"
                :precision="3"
                size="small"
                v-model.number="row.plannedFundsMonth"
                placeholder="计划资金"
              />
            </template>
          </el-table-column>
          <el-table-column
            prop="actualUseFunds"
            label="实际使用资金"
            align="center"
            width="160"
          >
            <template #default="{ row }">
              <el-input-number
                controls-position="right"
                :min="0"
                :precision="3"
                size="small"
                v-model.number="row.actualUseFunds"
                placeholder="实际使用资金"
              />
            </template>
          </el-table-column>
          <el-table-column
            prop="capitalDescription"
            align="center"
            width="170"
            label="资金描述"
          >
            <template #default="{ row }">
              <el-input
                v-model="row.capitalDescription"
                type="textarea"
                placeholder="描述"
                :autosize="{ minRows: 1, maxRows: 3 }"
              />
            </template>
          </el-table-column>
          <el-table-column
            prop="planDescription"
            align="center"
            width="170"
            label="进度描述"
          >
            <template #default="{ row }">
              <el-input
                v-model="row.planDescription"
                type="textarea"
                placeholder="描述"
                :autosize="{ minRows: 1, maxRows: 3 }"
              />
            </template>
          </el-table-column>
          <!-- <el-table-column prop="dutyUserId" align="center" label="负责人" /> -->
          <el-table-column prop="dutyUserId" label="负责人">
            <template #default="{ row }">
              <span>{{ getStateName(row.dutyUserId) }}</span>
            </template>
          </el-table-column>
          <el-table-column prop="outputData" align="center" label="输出资料" />
          <el-table-column prop="remark" align="center" label="备注" />
          <el-table-column
            label="操作"
            align="center"
            class-name="nodename"
            fixed="right"
            width="250"
          >
            <template #default="{ row }">
              <el-upload
                v-model:file-list="row.sysFileList"
                class="upload-demo"
                action="/prod-api/system/upload"
                :headers="uploadHeader"
                multiple
                :on-preview="handlePreview"
              >
                <el-button size="mini" type="primary"
                  >上传文件</el-button
                >
              </el-upload>
            </template>
          </el-table-column>
        </el-table>
      </el-form>
    </el-row>
  </el-form>
</template>
<script setup>
import { projectInfoAdd } from "@/api/shangbao";
import { FileSystemList } from "@/api/project/tenderReview";
import { stateOption } from "@/utils/common";
import { userList } from "@/api/projectInformation";
import { getToken } from "@/utils/auth";
import { ElMessage, ElMessageBox } from "element-plus";
import { required } from '@/utils/validate-helper'
const uploadHeader = ref({
  Authorization: "Bearer " + getToken(),
});
const Emits = defineEmits(["closed"]);
const { proxy } = getCurrentInstance();
const { project_status, build_status } = proxy.useDict(
  "project_status",
  "build_status"
);
const tableData = ref([]);
let { tableList } = defineProps(["tableList"]);
let Datas = new Date().getDate();
let Datam = new Date().getMonth();
const disabledDate = (time = new Date()) => {
  let dataM = time.getMonth();
  if (Datas < 15) {
    return dataM >= Datam;
  }
};
let tableDate = ref({
  spongeInvestAmountMonth: 0,
  investAmountMoneyMonth: 0,
  spongeInvestAmountMonth: 0,
  investAmountMoney: 0,
  spongeInvestAmount: 0,
  projectPlanInventoryList: []
});
const tableRules = reactive({
  actualFinishStartTime: required('完成开始日期'),
  actualFinishEndTime: required('完成结束日期'),
})

const findPosi = (tree, targetId, path = '') => {
  for (let i = 0; i < tree.length; i++) {
    const node = tree[i]
    if (node.id === targetId) {
      return path + i
    }
    if (node.children && node.children.length > 0) {
      const childPath = `${path}${i}.children.`
      const result = findPosi(node.children, targetId, childPath)
      if (result !== null) {
        return result
      }
    }
  }
  return null
}
// async function systemUploadM(p) {
//     if (p.length > 0) {
//         let formData = new FormData()
//         formData.append("file", p[0].raw)
//         let { data: { originalName, url } } = await systemUpload(formData)
//         tableDate.value.fileSaveRequestList = [url]
//     }
//     let array = {
//         reportTime: Date.parse(reportTime.value),
//     }
//     delete tableDate.value.id
//     progressSaveM({ ...tableDate.value, ...array })
// }
//建设进度数据
let isDisabled = ref(true);
let progressNum = ref(0);
// 上传照片
let isRequired = ref(false);
let reportTime = ref(new Date());
// 项目状态变更
const stateChange = (v) => {
  if (v > 4) {
    isDisabled.value = false;
    isRequired.value = true;
  } else {
    isDisabled.value = true;
    isRequired.value = false;
  }
};
const progressSaveM = async (data) => {
  let { code } = await projectInfoAdd(data);
  if (code == 200) {
    Emits("closed");
  }
};
const ruleFormRef = ref();
const tableFormRef = ref()
const checkClick = async () => {
  tableDate.value.progressNum = progressNum.value;
  console.log(" tableDate.value",  tableDate.value)
  ruleFormRef.value.validate((valid, fields) => {
    if (valid) {
      tableFormRef.value.validate((innerValid, innerFields) => {
        if(innerValid){
          tableDate.value.fileSaveRequestList = [];
          fileList1.value.forEach((element) => {
            if (element.hasOwnProperty("response")) {
              element.response.data.refType = "proProjectMonthReport";
              // element.response.data.refField = "proProjectMonthReportNode";
              tableDate.value.fileSaveRequestList.push(element.response.data);
            } else {
              tableDate.value.fileSaveRequestList.push(element);
            }
          });
          for (const item of tableDate.value.projectPlanInventoryList) {
            item.fileSaveRequestList = []
            item.sysFileList.forEach((element) => {
              if (element.hasOwnProperty("response")) {
                element.response.data.refType = "proProjectMonthReportNode";
                // element.response.data.refField = "proProjectMonthReportNode";
                item.fileSaveRequestList.push(element.response.data);
              } else {
                item.fileSaveRequestList.push(element);
              }
            });
          }
          console.log("tableDate.value", tableDate.value);
          progressSaveM(tableDate.value);
        } else {
          console.log('error', innerFields)
        }
      })
    }
  });
};
//当月完成项目总投资变化
const monthInvestChange = (val) => {
  const regex = /^(-?\d+)(\.\d+)?$/
  if(val && !regex.test(val)) return
  val = val ? val * 1 : 0
  const completeTotalInvest = tableList.completeTotalInvest * 1
  tableDate.value.completeTotalInvest = (completeTotalInvest + val) + ''
}
//当月完成海绵相关投资变化
const monthSpongeInvestChange = (val) => {
  const regex = /^(-?\d+)(\.\d+)?$/
  if(val && !regex.test(val)) return
  val = val ? val * 1 : 0
  const completeSpongeInvest = tableList.completeSpongeInvest * 1
  tableDate.value.completeSpongeInvest = (completeSpongeInvest + val) + ''
}
defineExpose({ checkClick, desertFilds });
async function projectPlanTemplateListM() {
  let { data } = await projectPlanTemplateList();
  tableData.value = data;
}
// let arrayList = ref({fileSaveRequestList:[]});
// function onCheck(row) {
//   arrayList.value = { ...row, fileSaveRequestList: [] };
// }
// function handleSuccess({ data }, t) {
//   data.refType = "proProjectMonthReport";
//   // data.response.data.refField = "proProjectMonthReportNode";
//   arrayList.value.fileSaveRequestList.push(data);
// }
/** 文件上传 */
const fileList1 = ref([]);
// const fileList2 = ref([]);
function handlePreview(file) {
  console.log(file);
  return ElMessageBox.confirm(`下载此文件: ${file.name}?`).then(
    () => window.open(file.url),
    () => false
  );
}
// function beforeRemove({response:{data}}) {
//   console.log("file", data)
//   arrayList.value.fileSaveRequestList=arrayList.value.fileSaveRequestList.filter(item => item.url !== data.url);
//   return true;
// }
const FileSystemListM = async (p) => {
  let { data } = await FileSystemList(p);
  fileList1.value = data;
};
function desertFilds() {
  proxy.$refs.ruleFormRef.resetFields();
}
const userListM = async () => {
  let { data } = await userList();
  personList.value = data;
};
const personList = ref([]);

const getStateName = (r) => {
  let a = "";
  personList.value.map((i) => {
    if (i.userId == r) {
      a = i;
    }
  });
  return a.nickName;
};
onMounted(() => {
  tableDate.value = JSON.parse(JSON.stringify(tableList));
  tableDate.value.monthInvest = tableDate.value.monthInvest || 0
  tableDate.value.monthSpongeInvest = tableDate.value.monthSpongeInvest || 0
  for (const item of tableDate.value.projectPlanInventoryList) {
    item.plannedFundsMonth = item.plannedFundsMonth || 0
    item.actualUseFunds = item.actualUseFunds || 0
  }
  // tableDate.value.inventoryList = JSON.parse(JSON.stringify(tableList.projectPlanInventoryList));
  // FileSystemListM({
  //   refType: "proProjectMonthReport",
  //   refId: tableList.projectTypeId,
  // });
  userListM();
});
</script>
<style lang="scss" scoped>
.water-analysis-page {
  padding: 20px;
  border: 1px solid #ddd;
}
</style>