浏览代码

设备维修、调薪申请

cz 10 月之前
父节点
当前提交
5a716f2cc3

+ 12 - 1
src/assets/styles/element-ui.scss

@@ -76,11 +76,22 @@
 
     .el-upload-dragger {
       width: 100%;
-      height: 200px;
+      // height: 200px;
     }
   }
 }
 
+.el-upload-dragger {
+  padding: 0px !important;
+
+  .el-icon--upload {
+    margin-bottom: 0px !important;
+    position: relative;
+    top: 8px;
+    font-size: 40px !important;
+  }
+}
+
 // dropdown
 .el-dropdown-menu {
   a {

+ 319 - 0
src/components/PDF/SalaryAdjustmentPDF.vue

@@ -0,0 +1,319 @@
+<template>
+  <div>
+    <div id="pdfDom" ref="pdfDom" style="padding: 20px 20px 0; text-align: center;font-size:12px;color:#333333" v-loading="loading">
+      <table border="1" style="width: 100%" class="table">
+        <tr>
+          <td :colspan="salaryStructureData.length+3" class="title">员工薪资调整申请单</td>
+        </tr>
+        <tr>
+          <td colspan="2">所属主体</td>
+          <td colspan="2">{{pdfData.companyName}}</td>
+          <td colspan="1">部门</td>
+          <td colspan="2">{{pdfData.deptName}}</td>
+          <td colspan="1">入职日期</td>
+          <td colspan="2">{{pdfData.entryDate}}</td>
+        </tr>
+        <tr>
+          <td colspan="2">员工姓名</td>
+          <td colspan="2">{{pdfData.nickName}}</td>
+          <td colspan="1">岗位</td>
+          <td colspan="2">{{pdfData.post}}</td>
+          <td colspan="1">生效日期</td>
+          <td colspan="2">{{pdfData.effectiveDate}}</td>
+        </tr>
+        <!-- <tr>
+          <td colspan="2">学历</td>
+          <td colspan="2">{{pdfData.education}}</td>
+          <td colspan="1">试用期限</td>
+          <td colspan="2">{{pdfData.probationPeriod}}</td>
+          <td colspan="1">转正日期</td>
+          <td colspan="2">{{pdfData.fullTimeDate}}</td>
+        </tr> -->
+        <tr>
+          <td colspan="2">
+            上班时长
+          </td>
+          <td :colspan="salaryStructureData.length+3-2" style="text-align:left">
+            月休{{pdfData.monthRest}}天,{{pdfData.dailyHours}}小时/天(上午{{pdfData.morningBeginTime}}至{{pdfData.morningEndTime}}
+            ;下午{{pdfData.afternoonBeginTime}}至{{pdfData.afternoonEndTime}}
+            )</td>
+        </tr>
+        <tr>
+          <td rowspan="5" style="width:5%">
+            调整前薪资
+          </td>
+          <td :colspan="salaryStructureData.length+2">
+            考勤结算 or 业绩/记件结算
+          </td>
+        </tr>
+        <tr>
+          <td rowspan="2" style="width:5%">考勤结算</td>
+          <td v-for="col in salaryStructureData" :key="col.value" :style="`width:${parseFloat(80/salaryStructureData.length).toFixed(2)}%`">
+            {{col.label}}
+          </td>
+          <td style="width:10%">合计</td>
+        </tr>
+        <tr>
+          <td v-for="col in salaryStructureData" :key="col.value" :style="`width:${parseFloat(80/salaryStructureData.length).toFixed(2)}%`">
+            {{pdfData.salaryDataOne[col.value+'-10']}}
+          </td>
+          <td>{{pdfData.oldAmount}}</td>
+        </tr>
+        <tr>
+          <td rowspan="2">业绩/记件结算</td>
+          <td v-for="col in salaryStructureData" :key="col.value">
+            {{col.label}}
+          </td>
+          <td>合计</td>
+        </tr>
+        <tr>
+          <td v-for="col in salaryStructureData" :key="col.value">
+            {{pdfData.salaryDataOne[col.value+'-20']}}
+          </td>
+          <td>{{pdfData.oldPerfAmount}}</td>
+        </tr>
+
+        <tr>
+          <td rowspan="5" style="width:5%">
+            调整后薪资
+          </td>
+          <td :colspan="salaryStructureData.length+2">
+            考勤结算 or 业绩/记件结算
+          </td>
+        </tr>
+        <tr>
+          <td rowspan="2" style="width:5%">考勤结算</td>
+          <td v-for="col in salaryStructureData" :key="col.value" :style="`width:${parseFloat(80/salaryStructureData.length).toFixed(2)}%`">
+            {{col.label}}
+          </td>
+          <td style="width:10%">合计</td>
+        </tr>
+        <tr>
+          <td v-for="col in salaryStructureData" :key="col.value" :style="`width:${parseFloat(80/salaryStructureData.length).toFixed(2)}%`">
+            {{pdfData.salaryData[col.value+'-10']}}
+          </td>
+          <td>{{pdfData.amount}}</td>
+        </tr>
+        <tr>
+          <td rowspan="2">业绩/记件结算</td>
+          <td v-for="col in salaryStructureData" :key="col.value">
+            {{col.label}}
+          </td>
+          <td>合计</td>
+        </tr>
+        <tr>
+          <td v-for="col in salaryStructureData" :key="col.value">
+            {{pdfData.salaryData[col.value+'-20']}}
+          </td>
+          <td>{{pdfData.perfAmount}}</td>
+        </tr>
+
+        <tr>
+          <td colspan="2">
+            薪资说明
+          </td>
+          <td :colspan="salaryStructureData.length+3-2" style="text-align:left">{{pdfData.salaryRemark}}</td>
+        </tr>
+        <tr>
+          <td colspan="2">
+            员工签字
+          </td>
+          <td colspan="3"></td>
+          <td colspan="1">
+            主管签字
+          </td>
+          <td colspan="4"></td>
+        </tr>
+        <tr>
+          <td colspan="2">
+            副总审批
+          </td>
+          <td colspan="3"></td>
+          <td colspan="1">
+            总经理审批
+          </td>
+          <td colspan="4"></td>
+        </tr>
+      </table>
+    </div>
+    <div style="text-align: center;margin-top:20px">
+      <el-button type="primary" v-print="printObj" size="default" v-debounce>打印</el-button>
+      <!-- <el-button type="primary" @click="clickDownload()" size="default" v-debounce>下载PDF</el-button>
+      <el-button type="primary" @click="exportExcel()" size="default" v-debounce>导出Excel</el-button>
+      <el-button type="primary" @click="saveData()" size="default" v-debounce>保存</el-button> -->
+
+    </div>
+  </div>
+</template>
+
+<script setup>
+import $ from "jquery";
+const { proxy } = getCurrentInstance();
+const pdfData = ref({});
+const props = defineProps({
+  rowData: Object,
+});
+const salaryStructureData = ref([]);
+const getData = () => {
+  proxy
+    .post("/salaryStructure/page", {
+      pageNum: 1,
+      pageSize: 999,
+    })
+    .then((res) => {
+      salaryStructureData.value = res.rows
+        .map((item) => {
+          return {
+            label: item.name,
+            value: item.id,
+          };
+        })
+        .reverse();
+    });
+};
+getData();
+
+const loading = ref(false);
+const getPdfData = (query) => {
+  loading.value = true;
+  proxy.post("/adjustSalaryApply/detail", query).then((res) => {
+    res.salaryData = {};
+    if (res.userSalaryDetailList && res.userSalaryDetailList.length > 0) {
+      for (let i = 0; i < res.userSalaryDetailList.length; i++) {
+        const row = res.userSalaryDetailList[i];
+        res.salaryData[row.salaryStructureId + "-" + row.type] = row.money;
+      }
+    }
+    res.salaryDataOne = {};
+    if (res.oldUserSalaryDetailList && res.oldUserSalaryDetailList.length > 0) {
+      for (let i = 0; i < res.oldUserSalaryDetailList.length; i++) {
+        const row = res.oldUserSalaryDetailList[i];
+        res.salaryDataOne[row.salaryStructureId + "-" + row.type] = row.money;
+      }
+    }
+    pdfData.value = res;
+    loading.value = false;
+    proxy
+      .post("/userSalaryManage/detail", { userId: res.userId })
+      .then((res) => {
+        pdfData.value.nickName = res.nickName;
+        pdfData.value.companyName = res.companyName;
+        pdfData.value.deptName = res.deptName;
+        pdfData.value.post = res.post;
+      });
+  });
+};
+
+watch(
+  () => props.rowData,
+  (val) => {
+    if (props.rowData.id) {
+      getPdfData({ id: props.rowData.id });
+    }
+  },
+  {
+    immediate: true,
+    deep: true,
+  }
+);
+
+const printObj = ref({
+  id: "pdfDom",
+  popTitle: "",
+  extraCss:
+    "https://cdn.bootcdn.net/ajax/libs/animate.css/4.1.1/animate.compat.css, https://cdn.bootcdn.net/ajax/libs/hover.css/2.3.1/css/hover-min.css",
+  extraHead: '<meta http-equiv="Content-Language"content="zh-cn"/>',
+});
+
+const clickDownload = () => {
+  proxy.getPdf("薪资确认单PDF文件");
+};
+
+const pdfDom = ref(null);
+const exportExcel = () => {
+  // pdfDom.value.exportExcel();
+  // isShowImg.value = false;
+  loading.value = true;
+  setTimeout(() => {
+    $("#pdfDom").table2excel({
+      exclude: ".noExl",
+      sheetName: `${pdfData.value.nickName} 薪资确认单`,
+      filename: `${pdfData.value.nickName} 薪资确认单`,
+      exclude_img: false,
+      exclude_links: false,
+      exclude_inputs: true,
+    });
+    // isShowImg.value = true;
+    loading.value = false;
+  }, 500);
+};
+
+const saveData = () => {
+  let userSalaryDetailList = [];
+  for (const key in pdfData.value.salaryData) {
+    let arr = key.split("-");
+    userSalaryDetailList.push({
+      salaryStructureId: arr[0],
+      type: arr[1],
+      money: pdfData.value.salaryData[key],
+    });
+  }
+  pdfData.value.userSalaryDetailList = userSalaryDetailList;
+  proxy.post("/userSalaryManage/edit", pdfData.value).then((res) => {
+    getPdfData({ id: props.rowData.id });
+    proxy.msgTip("操作成功", 1);
+    proxy.$emit("getList");
+  });
+};
+
+const changeAmount = (type) => {
+  let userSalaryDetailList = [];
+  for (const key in pdfData.value.salaryData) {
+    let arr = key.split("-");
+    userSalaryDetailList.push({
+      salaryStructureId: arr[0],
+      type: arr[1],
+      money: pdfData.value.salaryData[key],
+    });
+  }
+  pdfData.value.userSalaryDetailList = userSalaryDetailList;
+  let amount = pdfData.value.userSalaryDetailList
+    .filter((x) => x.type == "10")
+    .reduce(
+      (total, x) => Number(parseFloat((total += Number(x.money))).toFixed(2)),
+      0
+    );
+  pdfData.value.amount = amount;
+  let perfAmount = pdfData.value.userSalaryDetailList
+    .filter((x) => x.type == "20")
+    .reduce(
+      (total, x) => Number(parseFloat((total += Number(x.money))).toFixed(2)),
+      0
+    );
+  pdfData.value.perfAmount = perfAmount;
+};
+</script>
+
+<style lang="scss" scoped>
+.table {
+  .title {
+    font-size: 26px;
+    // font-weight: 700;
+  }
+  border-collapse: collapse;
+  border-spacing: 0;
+  width: 100%;
+  td {
+    text-align: center;
+    padding: 6px;
+    font-size: 12px;
+    // padding: 5px 10px;
+  }
+  .align-right {
+    text-align: right;
+  }
+}
+:deep(.el-input__wrapper) {
+  box-shadow: none;
+}
+</style>

+ 12 - 5
src/components/byForm/index.vue

@@ -108,21 +108,28 @@
             {{ i.slotName }}插槽占位符
           </slot>
 
-          <div class="upload" v-else-if="i.type == 'upload'">
+          <div class="upload" v-else-if="i.type == 'upload'" style="width:100%">
             <el-upload :file-list="formData[i.prop]?formData[i.prop]:[]" multiple :action="uploadUrl" :data="uploadData"
                        :list-type="i.listType ? i.listType : 'text'" :accept="i.accept?i.accept :''" :limit="i.limit?i.limit:3"
                        :before-upload="(file)=>handleBeforeUpload(file,i)" :on-success="()=>handleSuccess(i)"
-                       :on-remove="(file)=>handleRemove(file,i)" :on-exceed="()=>handleExceed(i)" :on-preview="onPreviewFile">
+                       :on-remove="(file)=>handleRemove(file,i)" :on-exceed="()=>handleExceed(i)" :on-preview="onPreviewFile" drag>
 
               <el-icon v-if="i.listType=='picture-card'">
                 <Plus />
               </el-icon>
               <!-- <span v-else-if="formOption.disabled" style="color:#409EFF">已上传:</span> -->
-              <el-button type="primary" plain v-else>点击上传</el-button>
+              <!-- <el-button type="primary" plain v-else>点击上传</el-button> -->
+
+              <div v-else>
+                <el-icon class="el-icon--upload"><upload-filled /></el-icon>
+                <div class="el-upload__text">
+                  点击或拖拽上传附件
+                </div>
+              </div>
             </el-upload>
           </div>
 
-          <div class="upload" v-else-if="i.type == 'uploadImg'">
+          <div class="upload" v-else-if="i.type == 'uploadImg'" style="width:100%">
             <el-upload :action="uploadUrl" accept=".gif, .jpeg, .jpg, .png" :show-file-list="false" :data="uploadData"
                        :before-upload="(file)=>handleBeforeUploadOne(file,i.prop,i.imgProp)" :on-success="()=>handleSuccessOne(i.imgProp)">
               <div v-loading="imgLoading">
@@ -470,7 +477,7 @@ formDataInit();
 loadInit();
 </script>
 
-<style scope>
+<style lang="scss" scope>
 .form-title {
   font-size: 14px;
   font-weight: bold;

+ 85 - 98
src/components/process/SF/Become.vue

@@ -17,7 +17,20 @@ const props = defineProps({
 const selectData = ref([]);
 const userList = ref([]);
 const deptData = ref([]);
-
+const employeeTypeData = ref([
+  {
+    label: "实习员工",
+    value: "10",
+  },
+  {
+    label: "试用员工",
+    value: "20",
+  },
+  {
+    label: "正式员工",
+    value: "30",
+  },
+]);
 const formData = reactive({
   data: {
     fileList: [],
@@ -51,95 +64,86 @@ const formConfig = computed(() => {
       title: "基本信息",
       haveLine: false,
     },
-    {
-      type: "input",
-      prop: "code",
-      label: "流水号",
-      placeholder: " ",
-      itemWidth: 50,
-      disabled: true,
-    },
-    {
-      type: "date",
-      prop: "applyTime",
-      itemType: "date",
-      label: "申请日期",
-      itemWidth: 50,
-      disabled: false,
-    },
+    // {
+    //   type: "date",
+    //   prop: "applyTime",
+    //   itemType: "date",
+    //   label: "申请日期",
+    //   itemWidth: 50,
+    //   disabled: true,
+    // },
     {
       type: "select",
-      prop: "createUser",
+      prop: "userId",
       label: "申请人",
       required: true,
       filterable: true,
       data: userList.value,
-      itemWidth: 50,
+      itemWidth: 100,
       disabled: true,
     },
     {
-      type: "treeSelect",
-      prop: "companyId",
-      label: "所属公司",
-      data: proxy.useUserStore().allDict["tree_all_company_data"],
-      propsTreeLabel: "deptName",
-      propsTreeValue: "deptId",
-      itemWidth: 50,
-      fn: (val) => {},
-      disabled: true,
+      type: "date",
+      prop: "promotionDate",
+      itemType: "date",
+      label: "转正日期",
+      itemWidth: 100,
+      disabled: false,
     },
     {
-      type: "treeSelect",
-      prop: "deptId",
-      label: "所属部门",
-      data: deptData.value,
-      propsTreeLabel: "deptName",
-      propsTreeValue: "deptId",
+      type: "select",
+      prop: "oldEmployeeType",
+      label: "当前劳动关系",
       itemWidth: 50,
       disabled: true,
+      data: employeeTypeData.value,
+      fn: () => {
+        // changeAmount();
+      },
     },
     {
       type: "select",
-      prop: "educationId",
-      label: "学历",
-      filterable: true,
-      multiple: false,
-      data: selectData.value,
+      prop: "employeeType",
+      label: "转劳动关系",
       itemWidth: 50,
+      disabled: false,
+      data: employeeTypeData.value,
       fn: (val) => {
-        let current = selectData.value.find((x) => x.value == val);
-        if (current) {
-          formData.data.amount = current.amount;
+        // changeAmount();
+        if (formData.data.oldEmployeeType == "10") {
+          if (val != "20") {
+            proxy.msgTip("只能转试用员工", 2);
+            formData.data.employeeType = "";
+          }
+        } else if (formData.data.oldEmployeeType == "20") {
+          if (val != "30") {
+            proxy.msgTip("只能转正式员工", 2);
+            formData.data.employeeType = "";
+          }
+        } else {
+          proxy.msgTip("不可再转", 2);
+          formData.data.employeeType = "";
         }
       },
     },
     {
       type: "input",
-      prop: "amount",
-      itemType: "text",
-      label: "学历补贴金额",
-      itemWidth: 50,
-      disabled: true,
-    },
-    {
-      type: "upload",
-      listType: "text",
-      accept: "",
-      prop: "fileList",
-      label: "学历证明附件",
+      prop: "remark",
+      itemType: "textarea",
+      label: "备注",
+      itemWidth: 100,
     },
   ];
 });
 
 const rules = ref({
-  applyTime: [{ required: true, message: "请选择申请日期", trigger: "change" }],
-  companyId: [{ required: true, message: "请选择所属公司", trigger: "change" }],
-  deptId: [{ required: true, message: "请选择所属部门", trigger: "change" }],
-  createUser: [{ required: true, message: "请选择申请人", trigger: "change" }],
-  educationId: [{ required: true, message: "请选择学历", trigger: "change" }],
-  fileList: [
-    { required: true, message: "请上传学历证明附件", trigger: "change" },
+  employeeType: [
+    { required: true, message: "请选择劳动关系", trigger: "change" },
+  ],
+  promotionDate: [
+    { required: true, message: "请选择转正日期", trigger: "change" },
   ],
+  // remark: [{ required: true, message: "请输入备注", trigger: "blur" }],
 });
 const isFormDetail = ref(false);
 if (route.query && route.query.processType && route.query.processType == 20) {
@@ -147,7 +151,7 @@ if (route.query && route.query.processType && route.query.processType == 20) {
 }
 const getDeptData = () => {
   proxy
-    .get(isFormDetail.value ? "/tenantUser/listAll" : "/tenantUser/list", {
+    .get("/tenantUser/listAll", {
       pageNum: 1,
       pageSize: 10000,
       tenantId: proxy.useUserStore().user.tenantId,
@@ -161,19 +165,6 @@ const getDeptData = () => {
         };
       });
     });
-
-  proxy
-    .get("/tenantDept/list", {
-      pageNum: 1,
-      pageSize: 9999,
-      keyword: "",
-      // ancestors: proxy.useUserStore().user.companyId,
-      tenantId: proxy.useUserStore().user.tenantId,
-      // type: 2,
-    })
-    .then((res) => {
-      deptData.value = proxy.handleTree(res.data, "deptId");
-    });
 };
 getDeptData();
 
@@ -191,7 +182,7 @@ const getDict = () => {
       }));
     });
 };
-getDict();
+// getDict();
 
 const handleSubmit = async (isStag = false) => {
   if (isStag) {
@@ -218,37 +209,33 @@ defineExpose({
   handleSubmit,
 });
 
+const getDetail = () => {
+  proxy
+    .post("/userSalaryManage/detail", { userId: formData.data.userId })
+    .then((res) => {
+      formData.data.oldEmployeeType = res.employeeType + "";
+      formData.data.probationRatio = res.probationRatio;
+      formData.data.internshipRatio = res.internshipRatio;
+    });
+};
+
 const getAllData = (businessId) => {
   if (businessId) {
-    proxy.post("/educationSubsidy/detail", { id: businessId }).then((res) => {
+    proxy.post("/promotionApply/detail", { id: businessId }).then((res) => {
+      res.employeeType = res.employeeType + "";
+      res.oldEmployeeType = res.oldEmployeeType + "";
       formData.data = res;
-      proxy
-        .post("/fileInfo/getList", { businessIdList: [businessId] })
-        .then((fileObj) => {
-          if (fileObj[businessId] && fileObj[businessId].length > 0) {
-            formData.data.fileList = fileObj[businessId]
-              .filter((x) => x.businessType == "0")
-              .map((item) => {
-                return {
-                  ...item,
-                  name: item.fileName,
-                  url: item.fileUrl,
-                };
-              });
-          } else {
-            formData.data.fileList = [];
-          }
-        });
+      // getDetail();
     });
   }
 };
 
 onMounted(() => {
   formOption.disabled = judgeStatus();
-  formData.data.applyTime = proxy.parseTime(new Date());
-  formData.data.companyId = proxy.useUserStore().user.companyId;
-  formData.data.deptId = proxy.useUserStore().user.dept.deptId;
-  formData.data.createUser = proxy.useUserStore().user.userId;
+  formData.data.userId = proxy.useUserStore().user.userId;
+  if (!route.query.processType) {
+    getDetail();
+  }
   if (route.query.businessId) {
     getAllData(route.query.businessId);
   }

+ 407 - 0
src/components/process/SF/ChangeSalary.vue

@@ -0,0 +1,407 @@
+<template>
+  <div style="width: 100%; padding: 0px 15px">
+    <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="formDom">
+      <template #detail>
+        <div style="width:100%;padding:0 40px">
+          <table border="1" style="width: 100%" class="table">
+            <tr>
+              <td rowspan="5" style="width:5%">
+                薪资
+              </td>
+              <td :colspan="salaryStructureData.length+2">
+                考勤结算 or 业绩/记件结算
+              </td>
+            </tr>
+            <tr>
+              <td rowspan="2" style="width:5%">考勤结算</td>
+              <td v-for="col in salaryStructureData" :key="col.value" :style="`width:${parseFloat(80/salaryStructureData.length).toFixed(2)}%`">
+                {{col.label}}
+              </td>
+              <td style="width:10%">合计</td>
+            </tr>
+            <tr>
+              <td v-for="col in salaryStructureData" :key="col.value" :style="`width:${parseFloat(80/salaryStructureData.length).toFixed(2)}%`">
+                <!-- {{formData.data.salaryData[col.value+'-10']}} -->
+                <el-input-number onmousewheel="return false;" v-model="formData.data.salaryData[col.value+'-10']" placeholder=" " style="width: 100%"
+                                 :precision="2" :controls="false" :min="0" @change="changeAmount('10')" :disabled="col.disabled" />
+              </td>
+              <td>{{formData.data.amount}}</td>
+            </tr>
+            <tr>
+              <td rowspan="2">业绩/记件结算</td>
+              <td v-for="col in salaryStructureData" :key="col.value">
+                {{col.label}}
+              </td>
+              <td>合计</td>
+            </tr>
+            <tr>
+              <td v-for="col in salaryStructureData" :key="col.value">
+                <!-- {{formData.data.salaryData[col.value+'-20']}} -->
+                <el-input-number onmousewheel="return false;" v-model="formData.data.salaryData[col.value+'-20']" placeholder=" " style="width: 100%"
+                                 :precision="2" :controls="false" :min="0" @change="changeAmount('20')" :disabled="col.disabled" />
+              </td>
+              <td>{{formData.data.perfAmount}}</td>
+            </tr>
+          </table>
+        </div>
+      </template>
+    </byForm>
+  </div>
+</template>
+
+<script setup>
+import byForm from "@/components/byForm/index";
+import { useRoute } from "vue-router";
+const { proxy } = getCurrentInstance();
+const route = useRoute();
+// 接收父组件的传值
+const props = defineProps({
+  queryData: Object,
+});
+const selectData = ref([]);
+const userList = ref([]);
+const salaryStructureData = ref([]);
+const deptData = ref([]);
+const employeeTypeData = ref([
+  {
+    label: "实习员工",
+    value: "10",
+  },
+  {
+    label: "试用员工",
+    value: "20",
+  },
+  {
+    label: "正式员工",
+    value: "30",
+  },
+]);
+const formData = reactive({
+  data: {
+    fileList: [],
+  },
+});
+const formDom = ref(null);
+const judgeStatus = () => {
+  if (route.query.processType == 20 || route.query.processType == 10) {
+    return true;
+  }
+  if (props.queryData.recordList && props.queryData.recordList.length > 0) {
+    let data = props.queryData.recordList.filter(
+      (item) => item.status === 2 && item.nodeType !== 1
+    );
+    if (data && data.length > 0) {
+      return true;
+    }
+  }
+  return false;
+};
+const formOption = reactive({
+  inline: true,
+  labelWidth: 120,
+  itemWidth: 100,
+  disabled: false,
+});
+const formConfig = computed(() => {
+  return [
+    {
+      type: "title",
+      title: "基本信息",
+      haveLine: false,
+    },
+    // {
+    //   type: "date",
+    //   prop: "applyTime",
+    //   itemType: "date",
+    //   label: "申请日期",
+    //   itemWidth: 50,
+    //   disabled: true,
+    // },
+    {
+      type: "select",
+      prop: "userId",
+      label: "申请人",
+      required: true,
+      filterable: true,
+      data: userList.value,
+      itemWidth: 100,
+      disabled: true,
+    },
+    {
+      type: "select",
+      prop: "employeeType",
+      label: "劳动关系",
+      itemWidth: 100,
+      disabled: true,
+      data: employeeTypeData.value,
+    },
+    {
+      type: "number",
+      prop: "internshipRatio",
+      label: "实习期薪资比例(%)",
+      precision: 2,
+      min: 0,
+      max: 100,
+      controls: false,
+      disabled: true,
+      itemWidth: 50,
+      fn: () => {
+        changeAmount();
+      },
+    },
+    {
+      type: "number",
+      prop: "probationRatio",
+      label: "试用期薪资比例(%)",
+      precision: 2,
+      min: 0,
+      max: 100,
+      controls: false,
+      disabled: true,
+      itemWidth: 50,
+      fn: () => {
+        changeAmount();
+      },
+    },
+    {
+      type: "date",
+      prop: "adjustDate",
+      itemType: "date",
+      label: "调薪日期",
+      itemWidth: 100,
+      disabled: false,
+    },
+    {
+      type: "input",
+      prop: "adjustRemark",
+      itemType: "textarea",
+      label: "调薪说明",
+      itemWidth: 100,
+    },
+    {
+      type: "title1",
+      title: "调薪明细",
+    },
+    {
+      type: "slot",
+      slotName: "detail",
+    },
+  ];
+});
+
+const rules = ref({
+  // employeeType: [
+  //   { required: true, message: "请选择劳动关系", trigger: "change" },
+  // ],
+  adjustDate: [
+    { required: true, message: "请选择调薪日期", trigger: "change" },
+  ],
+  // remark: [{ required: true, message: "请输入备注", trigger: "blur" }],
+});
+const isFormDetail = ref(false);
+if (route.query && route.query.processType && route.query.processType == 20) {
+  isFormDetail.value = true;
+}
+const getDeptData = () => {
+  proxy
+    .get("/tenantUser/listAll", {
+      pageNum: 1,
+      pageSize: 10000,
+      tenantId: proxy.useUserStore().user.tenantId,
+      // companyId: proxy.useUserStore().user.companyId,
+    })
+    .then((res) => {
+      userList.value = res.rows.map((item) => {
+        return {
+          label: item.nickName,
+          value: item.userId,
+        };
+      });
+    });
+
+  proxy
+    .post("/salaryStructure/page", {
+      pageNum: 1,
+      pageSize: 999,
+    })
+    .then((res) => {
+      salaryStructureData.value = res.rows
+        .map((item) => {
+          let obj = {
+            label: item.name,
+            value: item.id,
+          };
+          obj.disabled = !item.name.includes("基本工资");
+          return obj;
+        })
+        .reverse();
+    });
+};
+getDeptData();
+
+const getDict = () => {
+  proxy
+    .post("/educationConfig/page", {
+      pageNum: 1,
+      pageSize: 999,
+    })
+    .then((res) => {
+      selectData.value = res.rows.map((x) => ({
+        ...x,
+        label: x.name,
+        value: x.id,
+      }));
+    });
+};
+// getDict();
+
+const handleSubmit = async (isStag = false) => {
+  if (isStag) {
+    return true;
+  }
+  let flag = await formDom.value.handleSubmit(() => {});
+  if (flag) {
+    return true;
+  } else {
+    setTimeout(() => {
+      const errorDiv = document.getElementsByClassName("is-error");
+      errorDiv[0].scrollIntoView();
+    }, 0);
+  }
+  return flag;
+};
+
+const getFormData = () => {
+  return proxy.deepClone(formData.data);
+};
+// 向父组件暴露
+defineExpose({
+  getFormData,
+  handleSubmit,
+});
+
+const getDetail = () => {
+  proxy
+    .post("/userSalaryManage/detail", { userId: formData.data.userId })
+    .then((res) => {
+      res.employeeType = res.employeeType + "";
+      res.salaryData = {};
+      if (res.userSalaryDetailList && res.userSalaryDetailList.length > 0) {
+        for (let i = 0; i < res.userSalaryDetailList.length; i++) {
+          const row = res.userSalaryDetailList[i];
+          res.salaryData[row.salaryStructureId + "-" + row.type] = row.money;
+        }
+      }
+      formData.data = res;
+    });
+};
+
+const changeRatio = () => {
+  let ratio = 1;
+  if (
+    formData.data.employeeType &&
+    formData.data.internshipRatio &&
+    formData.data.probationRatio
+  ) {
+    switch (formData.data.employeeType) {
+      case "10":
+        ratio = parseFloat(formData.data.internshipRatio / 100).toFixed(2);
+        break;
+      case "20":
+        ratio = parseFloat(formData.data.probationRatio / 100).toFixed(2);
+        break;
+      default:
+        break;
+    }
+    formData.data.amount = parseFloat(
+      formData.data.amount * Number(ratio)
+    ).toFixed(2);
+    formData.data.perfAmount = parseFloat(
+      formData.data.perfAmount * Number(ratio)
+    ).toFixed(2);
+  }
+};
+
+const changeAmount = (type) => {
+  let userSalaryDetailList = [];
+  for (const key in formData.data.salaryData) {
+    let arr = key.split("-");
+    userSalaryDetailList.push({
+      salaryStructureId: arr[0],
+      type: arr[1],
+      money: formData.data.salaryData[key],
+    });
+  }
+  formData.data.userSalaryDetailList = userSalaryDetailList;
+  let amount = formData.data.userSalaryDetailList
+    .filter((x) => x.type == "10")
+    .reduce(
+      (total, x) => Number(parseFloat((total += Number(x.money))).toFixed(2)),
+      0
+    );
+  formData.data.amount = amount;
+  let perfAmount = formData.data.userSalaryDetailList
+    .filter((x) => x.type == "20")
+    .reduce(
+      (total, x) => Number(parseFloat((total += Number(x.money))).toFixed(2)),
+      0
+    );
+  formData.data.perfAmount = perfAmount;
+  changeRatio();
+};
+
+const getAllData = (businessId) => {
+  if (businessId) {
+    proxy.post("/adjustSalaryApply/detail", { id: businessId }).then((res) => {
+      res.employeeType = res.employeeType + "";
+      res.salaryData = {};
+      if (res.userSalaryDetailList && res.userSalaryDetailList.length > 0) {
+        for (let i = 0; i < res.userSalaryDetailList.length; i++) {
+          const row = res.userSalaryDetailList[i];
+          res.salaryData[row.salaryStructureId + "-" + row.type] = row.money;
+        }
+      }
+      formData.data = res;
+    });
+  }
+};
+
+onMounted(() => {
+  formOption.disabled = judgeStatus();
+  formData.data.userId = proxy.useUserStore().user.userId;
+  if (!route.query.processType) {
+    getDetail();
+  }
+  if (route.query.businessId) {
+    getAllData(route.query.businessId);
+  }
+});
+</script>
+
+<style lang="scss" scoped>
+.table {
+  .title {
+    font-size: 26px;
+    // font-weight: 700;
+  }
+  border-collapse: collapse;
+  border-spacing: 0;
+  width: 100%;
+  td {
+    text-align: center;
+    padding: 6px;
+    font-size: 12px;
+    // padding: 5px 10px;
+  }
+  .align-right {
+    text-align: right;
+  }
+}
+
+:deep(.table .el-input__wrapper) {
+  box-shadow: none;
+}
+:deep(.table .el-input.is-disabled .el-input__wrapper) {
+  box-shadow: none !important;
+}
+</style>

+ 11 - 1
src/components/process/SF/StartConfirm.vue

@@ -85,6 +85,14 @@ const formConfig = computed(() => {
       title: "开工确认",
     },
     {
+      type: "input",
+      itemType: "text",
+      label: "生产要求",
+      prop: "other",
+      disabled: true,
+      itemWidth: 100,
+    },
+    {
       type: "date",
       itemType: "date",
       label: "预计上线",
@@ -246,13 +254,15 @@ const getAllData = (businessId) => {
       .post("/productionBeginConfirm/detail", { id: businessId })
       .then((res) => {
         formData.data = res;
+        formData.data.other =
+          "请履行双方二次达成的如下交期共识,以便及时生产、及时出货、与客户做好交付确认";
       });
   }
 };
 
 onMounted(() => {
   // formOption.disabled = judgeStatus();
-
+  // formData.data.other='《请履行双方二次达成的如下交期共识,以便及时生产、及时出货、与客户做好交付确认》'
   if (route.query.businessId) {
     getAllData(route.query.businessId);
   }

+ 2 - 3
src/views/EHSD/procurement/purchasedEHSD/selectPurchased.vue

@@ -375,9 +375,8 @@ const handleSelect = (row) => {
   line-height: 24px;
   padding-left: 4px;
 }
-</style>
-<style>
-.redClass {
+:deep(.redClass) {
   color: #f54a45 !important;
 }
 </style>
+

+ 17 - 12
src/views/EHSD/productLibrary/companyProduct/index.vue

@@ -1522,18 +1522,23 @@ const getDtl = (row) => {
         }
       });
     // bom清单附件
-    formData.data.productBomDetailList.forEach((x) => {
-      x.bomFileList = [];
-    });
-    let ids = formData.data.productBomDetailList.map((x) => x.id);
-    proxy.getFileData({
-      businessIdList: ids,
-      data: formData.data.productBomDetailList,
-      att: "id",
-      businessType: "10",
-      fileAtt: "bomFileList",
-      filePathAtt: "fileUrl",
-    });
+    if (
+      formData.data.productBomDetailList &&
+      formData.data.productBomDetailList.length > 0
+    ) {
+      formData.data.productBomDetailList.forEach((x) => {
+        x.bomFileList = [];
+      });
+      let ids = formData.data.productBomDetailList.map((x) => x.id);
+      proxy.getFileData({
+        businessIdList: ids,
+        data: formData.data.productBomDetailList,
+        att: "id",
+        businessType: "10",
+        fileAtt: "bomFileList",
+        filePathAtt: "fileUrl",
+      });
+    }
 
     dialogVisible.value = true;
   });

+ 40 - 41
src/views/MES/productionOrder/index.vue

@@ -782,32 +782,32 @@ const config = computed(() => {
       },
     },
 
-    {
-      attrs: {
-        label: "开工确认状态",
-        prop: "prodConfirmStatus",
-        width: 110,
-        fixed: "right",
-      },
-      render(val) {
-        if (val) {
-          return proxy.dictValueLabel(val, prodConfirmStatusData.value);
-        } else {
-          return "未发起";
-        }
-      },
-    },
-    {
-      attrs: {
-        prop: "isAgreeWork",
-        label: "是否同意开工",
-        width: 120,
-        fixed: "right",
-      },
-      render(val) {
-        return val == 1 ? "是" : "否";
-      },
-    },
+    // {
+    //   attrs: {
+    //     label: "开工确认状态",
+    //     prop: "prodConfirmStatus",
+    //     width: 110,
+    //     fixed: "right",
+    //   },
+    //   render(val) {
+    //     if (val) {
+    //       return proxy.dictValueLabel(val, prodConfirmStatusData.value);
+    //     } else {
+    //       return "未发起";
+    //     }
+    //   },
+    // },
+    // {
+    //   attrs: {
+    //     prop: "isAgreeWork",
+    //     label: "是否同意开工",
+    //     width: 120,
+    //     fixed: "right",
+    //   },
+    //   render(val) {
+    //     return val == 1 ? "是" : "否";
+    //   },
+    // },
     {
       attrs: {
         label: "操作",
@@ -851,21 +851,20 @@ const config = computed(() => {
                 },
               }
             : {},
-          row.confirmStatus == "1"
-            ? // &&
-              // (row.prodConfirmStatus == null || row.prodConfirmStatus == 30)
-              {
-                attrs: {
-                  label: "开工确认",
-                  type: "primary",
-                  text: true,
-                },
-                el: "button",
-                click() {
-                  startConfirm(row);
-                },
-              }
-            : {},
+          // row.confirmStatus == "1"
+          //   ?
+          //     {
+          //       attrs: {
+          //         label: "开工确认",
+          //         type: "primary",
+          //         text: true,
+          //       },
+          //       el: "button",
+          //       click() {
+          //         startConfirm(row);
+          //       },
+          //     }
+          //   : {},
           // row.produceStatus == 2
           //   ? {
           //       attrs: {

+ 309 - 139
src/views/MES/productionTask/index.vue

@@ -109,7 +109,7 @@
 
         <template #btn="{ item }">
           <div style="width: 100%">
-            <!-- <span class="el-click" @click="startConfirm(item)" style="margin-left:10px">开工确认</span> -->
+            <span class="el-click" @click="startConfirm(item)" style="margin-left:10px">开工确认</span>
             <span class="el-click" @click="printQrCode(item)" style="margin-left:10px">任务单</span>
             <!-- <el-popover placement="bottom-start" title="" :width="300" trigger="hover">
               <div style="width:100%">
@@ -181,8 +181,8 @@
 
         <template #isAgreeWork="{item}">
           <div style="width: 100%">
-            <span v-if="item.isAgreeWork=='0'" class="red"> 否 </span>
-            <span v-else> 是 </span>
+            <span v-if="item.isAgreeWork=='0'" class="red" style="cursor:pointer"> 否 </span>
+            <span v-else style="cursor:pointer"> 是 </span>
           </div>
         </template>
 
@@ -272,7 +272,7 @@
 
         <template #btn="{ item }">
           <div style="width: 100%">
-            <!-- <span class="el-click" @click="startConfirm(item)" style="margin-left:10px">开工确认</span> -->
+            <span class="el-click" @click="startConfirm(item)" style="margin-left:10px">开工确认</span>
             <span class="el-click" @click="printQrCode(item)" style="margin-left:10px">任务单</span>
             <!-- <el-popover placement="bottom-start" title="" :width="300" trigger="hover">
               <div style="width:100%">
@@ -331,8 +331,8 @@
 
         <template #isAgreeWork="{item}">
           <div style="width: 100%">
-            <span v-if="item.isAgreeWork=='0'" class="red"> 否 </span>
-            <span v-else> 是 </span>
+            <span v-if="item.isAgreeWork=='0'" class="red" style="cursor:pointer"> 否 </span>
+            <span v-else style="cursor:pointer"> 是 </span>
           </div>
         </template>
 
@@ -459,6 +459,14 @@
               </template>
             </el-table-column>
           </el-table-column>
+          <!-- <el-table-column label="操作者" width="120">
+            <template #default="{ row, $index }">
+              <el-select v-model="row.opUserId" placeholder=" " filterable style="width: 100%" @change="val=>changeOpUser(val)">
+                <el-option v-for="item in userList" :label="item.label" :value="item.value">
+                </el-option>
+              </el-select>
+            </template>
+          </el-table-column> -->
         </el-table>
       </div>
     </div>
@@ -1032,78 +1040,40 @@
       </template>
     </el-dialog>
 
-    <el-dialog :title="'开工确认'" v-model="confirmDialog" width="60%" destroy-on-close>
-      <!-- <div style="display:flex">
-        <div class="left" style="width:100%;">
-          <TitleInfo :content="'确认信息'" :size="16"></TitleInfo>
-          <div style="height:12px"></div>
-          <byForm :formConfig="confirmFormConfig" :formOption="confirmFormOption" v-model="confirmFormData.data" :rules="confirmRules"
-                  ref="confirmFormDom" v-loading="formLoading">
-          </byForm>
-          <div style="text-align:center" v-if="confirmFormData.data.beginWorkStatus !=1">
-            <el-button @click="submitConfirm(true)" type="primary" size="default" v-debounce v-if="confirmFormData.data.isAgreeWork==1">提
-              交</el-button>
-            <el-button @click="submitConfirm(false)" type="primary" size="default" v-debounce>暂 存</el-button>
-          </div>
-        </div>
-        <div class="right" style="width:50%;border-left:1px solid #dfdada;padding-left:15px">
-          <div>
-            <TitleInfo :content="'打印预览'" :size="16"></TitleInfo>
-            <div id="printDom" style="width:100%">
-              <div class="title">
-                开工确认通知单
-              </div>
-              <table class="table" border>
-                <tr>
-                  <td style="width:25%">预计上线</td>
-                  <td style="width:25%">{{confirmFormData.data.expectBeginTime}}</td>
-                  <td style="width:25%">预计交货</td>
-                  <td style="width:25%">{{confirmFormData.data.expectDeliveryTime}}</td>
-                </tr>
-                <tr>
-                  <td>是否同意开工生产</td>
-                  <td colspan="3">{{confirmFormData.data.isAgreeWork==1?"是":"否"}}</td>
-                </tr>
-                <tr>
-                  <td>走柜是否明确</td>
-                  <td>{{confirmFormData.data.isAgreeWork==1?"是":"否"}}</td>
-                  <td>走柜时间</td>
-                  <td>{{confirmFormData.data.cabinetExitTime}}</td>
-                </tr>
-                <tr>
-                  <td>其他说明</td>
-                  <td colspan="3">{{confirmFormData.data.workRemark}}</td>
-                </tr>
-              </table>
-            </div>
-          </div>
-          <div style="text-align:center;margin-top:20px">
-            <el-button v-print="printObjOne" type="primary" size="default" v-debounce>打 印</el-button>
-          </div>
-
-        </div>
-      </div> -->
+    <el-dialog :title="'开工确认'" v-model="confirmDialogOne" width="60%" destroy-on-close>
 
-      <byForm :formConfig="confirmFormConfig" :formOption="confirmFormOption" v-model="confirmFormData.data" :rules="confirmRules"
-              ref="confirmFormDom" v-loading="formLoading">
+      <byForm :formConfig="confirmFormConfigOne" :formOption="confirmFormOptionOne" v-model="confirmFormDataOne.data" :rules="confirmRulesOne"
+              ref="confirmFormDomOne" v-loading="formLoading">
         <template #detail>
           <div style="width:100%;padding:0 20px">
-            <el-table :data="confirmFormData.data.purchaseProductList">
-              <el-table-column prop="productCode" label="创建时间" width="160" />
-              <el-table-column prop="productCode" label="是否同意开工生产" width="160" />
-              <el-table-column prop="productName" label="走柜是否明确" min-width="130" />
-              <el-table-column label="走柜时间" prop="走柜时间" width="160" />
-              <el-table-column label="其他说明" prop="quantity" width="100" />
-              <el-table-column label="预计上线" prop="quantity" width="100" />
-              <el-table-column label="预计交货" prop="quantity" width="100" />
+            <el-table :data="confirmFormDataOne.data.historyList">
+              <el-table-column prop="createTime" label="创建时间" width="160" />
+              <el-table-column prop="expectBeginTime" label="预计上线" width="110" />
+              <el-table-column prop="expectDeliveryTime" label="预计交货" width="110" />
+              <el-table-column prop="isAgreeWork" label="是否同意开工生产" width="140">
+                <template #default="{ row }">
+                  <div>
+                    {{dictValueLabel(row.isAgreeWork,isData)}}
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column prop="isCabinetConfirm" label="走柜是否明确" width="120">
+                <template #default="{ row }">
+                  <div>
+                    {{dictValueLabel(row.isCabinetConfirm,isData)}}
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column prop="cabinetExitTime" label="走柜时间" width="110" />
+              <el-table-column prop="workRemark" label="其他说明" />
             </el-table>
           </div>
         </template>
       </byForm>
 
       <template #footer>
-        <el-button @click="confirmDialog =false" size="default" v-debounce>取 消</el-button>
-        <el-button @click="submitConfirm(true)" type="primary" size="default" v-debounce v-if="confirmFormData.data.isAgreeWork==1">提
+        <el-button @click="confirmDialogOne =false" size="default" v-debounce>取 消</el-button>
+        <el-button @click="submitConfirmOne(true)" type="primary" size="default" v-debounce v-if="rowDataOne.beginWorkStatus ==10">提
           交</el-button>
       </template>
 
@@ -1205,6 +1175,30 @@ const dialogVisible = ref(false);
 const remarkDialog = ref(false);
 
 const modalType = ref("add");
+const isData = ref([
+  {
+    label: "否",
+    value: 0,
+  },
+  {
+    label: "是",
+    value: 1,
+  },
+]);
+const prodConfirmStatusData = ref([
+  {
+    label: "确认中",
+    value: 10,
+  },
+  {
+    label: "不同意",
+    value: 20,
+  },
+  {
+    label: "同意",
+    value: 30,
+  },
+]);
 const statusData = ref([
   {
     label: "未开始",
@@ -1345,34 +1339,39 @@ const selectConfig = computed(() => [
     },
   },
   {
-    label: "业务公司",
-    prop: "contractCompanyId",
-    data: companyData.value,
-    isFilter: false,
+    label: "归属业务",
+    prop: "contractBelongType",
+    data: belongTypeData.value,
   },
   {
     label: "订单组别",
     prop: "companyId",
     data: companyData.value,
   },
-  {
-    label: "生产状态",
-    prop: "produceStatus",
-    data: statusData.value,
-  },
-  {
-    label: "是否逾期",
-    prop: "isOverdue",
-    data: isOverdueData.value,
-  },
-  {
-    type: "time",
-    label: "交期",
-    placeholder: "开始日期",
-    prop: "staDeliveryPeriod",
-    placeholderOne: "结束日期",
-    propOne: "endDeliveryPeriod",
-  },
+  // {
+  //   label: "业务公司",
+  //   prop: "contractCompanyId",
+  //   data: companyData.value,
+  //   isFilter: false,
+  // },
+  // {
+  //   label: "生产状态",
+  //   prop: "produceStatus",
+  //   data: statusData.value,
+  // },
+  // {
+  //   label: "是否逾期",
+  //   prop: "isOverdue",
+  //   data: isOverdueData.value,
+  // },
+  // {
+  //   type: "time",
+  //   label: "交期",
+  //   placeholder: "开始日期",
+  //   prop: "staDeliveryPeriod",
+  //   placeholderOne: "结束日期",
+  //   propOne: "endDeliveryPeriod",
+  // },
   // {
   //   type: "time",
   //   label: "下单日期",
@@ -1412,14 +1411,42 @@ const config = ref([
       fixed: "left",
     },
   },
+  // {
+  //   attrs: {
+  //     label: "开工确认状态",
+  //     prop: "prodConfirmStatus",
+  //     width: 110,
+  //     fixed: "left",
+  //   },
+  //   render(val) {
+  //     if (val) {
+  //       return proxy.dictValueLabel(val, prodConfirmStatusData.value);
+  //     } else {
+  //       return "未发起";
+  //     }
+  //   },
+  // },
   {
     attrs: {
-      slot: "isAgreeWork",
-      label: "是否同意开工",
-      width: 120,
+      label: "开工确认状态",
+      prop: "beginWorkStatus",
+      width: 110,
       fixed: "left",
     },
+    render(val) {
+      if (val) {
+        return proxy.dictValueLabel(val, prodConfirmStatusData.value);
+      }
+    },
   },
+  // {
+  //   attrs: {
+  //     slot: "isAgreeWork",
+  //     label: "是否同意开工",
+  //     width: 120,
+  //     fixed: "left",
+  //   },
+  // },
   {
     attrs: {
       label: "客户",
@@ -1725,14 +1752,42 @@ const configCopy = ref([
       fixed: "left",
     },
   },
+  // {
+  //   attrs: {
+  //     label: "开工确认状态",
+  //     prop: "prodConfirmStatus",
+  //     width: 110,
+  //     fixed: "left",
+  //   },
+  //   render(val) {
+  //     if (val) {
+  //       return proxy.dictValueLabel(val, prodConfirmStatusData.value);
+  //     } else {
+  //       return "未发起";
+  //     }
+  //   },
+  // },
   {
     attrs: {
-      slot: "isAgreeWork",
-      label: "是否同意开工",
-      width: 120,
+      label: "开工确认状态",
+      prop: "beginWorkStatus",
+      width: 110,
       fixed: "left",
     },
+    render(val) {
+      if (val) {
+        return proxy.dictValueLabel(val, prodConfirmStatusData.value);
+      }
+    },
   },
+  // {
+  //   attrs: {
+  //     slot: "isAgreeWork",
+  //     label: "是否同意开工",
+  //     width: 120,
+  //     fixed: "left",
+  //   },
+  // },
   {
     attrs: {
       label: "客户",
@@ -3062,13 +3117,31 @@ const confirmFormData = reactive({
 });
 const confirmFormOption = reactive({
   inline: true,
-  labelWidth: 100,
+  labelWidth: 140,
   itemWidth: 100,
-  disabled: false,
+  disabled: true,
 });
 const confirmFormConfig = computed(() => [
   {
     type: "title1",
+    title: "开工确认",
+  },
+  {
+    type: "date",
+    itemType: "date",
+    label: "预计上线",
+    prop: "expectBeginTime",
+    itemWidth: 100,
+  },
+  {
+    type: "date",
+    itemType: "date",
+    label: "预计交货",
+    prop: "expectDeliveryTime",
+    itemWidth: 100,
+  },
+  {
+    type: "title1",
     title: "业务信息",
   },
   {
@@ -3105,33 +3178,16 @@ const confirmFormConfig = computed(() => [
     prop: "workRemark",
     itemWidth: 100,
   },
-  {
-    type: "title1",
-    title: "开工确认",
-  },
-  {
-    type: "date",
-    itemType: "date",
-    label: "预计上线",
-    prop: "expectBeginTime",
-    itemWidth: 100,
-  },
-  {
-    type: "date",
-    itemType: "date",
-    label: "预计交货",
-    prop: "expectDeliveryTime",
-    itemWidth: 100,
-  },
-  {
-    type: "title1",
-    title: "开工历史记录",
-  },
-  {
-    type: "slot",
-    slotName: "detail",
-    label: "",
-  },
+
+  // {
+  //   type: "title1",
+  //   title: "开工历史记录",
+  // },
+  // {
+  //   type: "slot",
+  //   slotName: "detail",
+  //   label: "",
+  // },
 ]);
 const confirmRules = ref({
   expectBeginTime: [
@@ -3152,19 +3208,6 @@ const confirmRules = ref({
   // workRemark: [{ required: true, message: "请输入备注", trigger: "blur" }],
 });
 
-const startConfirm = (row) => {
-  confirmDialog.value = true;
-  proxy
-    .post("/produceOrderDetail/beginWorkDetail", {
-      id: row.id,
-    })
-    .then((res) => {
-      confirmFormData.data = res;
-      confirmFormData.data.purchaseProductList = [];
-      confirmFormOption.disabled = confirmFormData.data.beginWorkStatus == 1;
-    });
-};
-
 const submitConfirm = (flag) => {
   if (flag) {
     confirmFormDom.value.handleSubmit(() => {
@@ -3299,6 +3342,133 @@ const changeRowRemark = (val, id) => {
     (err) => {}
   );
 };
+
+const lookRecords = (row) => {
+  proxy
+    .post("/productionBeginConfirm/getHistoryList", {
+      prodOrderId: row.produceOrderId,
+    })
+    .then((res) => {
+      if (res && res.length > 0) {
+        confirmFormData.data = res[0];
+        confirmDialog.value = true;
+      } else {
+        proxy.msgTip("暂无开工确认记录", 2);
+      }
+    });
+};
+
+const confirmFormDomOne = ref(null);
+const confirmDialogOne = ref(false);
+const confirmFormDataOne = reactive({
+  data: {},
+});
+const confirmFormOptionOne = reactive({
+  inline: true,
+  labelWidth: 100,
+  itemWidth: 100,
+  disabled: false,
+});
+const confirmFormConfigOne = computed(() => [
+  {
+    type: "title1",
+    title: "开工确认",
+  },
+  {
+    type: "date",
+    itemType: "date",
+    label: "预计上线",
+    prop: "expectBeginTime",
+    itemWidth: 100,
+  },
+  {
+    type: "date",
+    itemType: "date",
+    label: "预计交货",
+    prop: "expectDeliveryTime",
+    itemWidth: 100,
+  },
+  {
+    type: "title1",
+    title: "开工确认历史记录",
+  },
+  {
+    type: "slot",
+    slotName: "detail",
+    label: "",
+  },
+]);
+const confirmRulesOne = ref({
+  expectBeginTime: [
+    { required: true, message: "请选择预计上线", trigger: "change" },
+  ],
+  expectDeliveryTime: [
+    { required: true, message: "请选择预计交货", trigger: "change" },
+  ],
+  isAgreeWork: [
+    { required: true, message: "请选择是否同意开工生产", trigger: "change" },
+  ],
+  isCabinetConfirm: [
+    { required: true, message: "请选择走柜是否明确", trigger: "change" },
+  ],
+  cabinetExitTime: [
+    { required: true, message: "请选择走柜时间", trigger: "change" },
+  ],
+  // workRemark: [{ required: true, message: "请输入备注", trigger: "blur" }],
+});
+
+const rowDataOne = ref({});
+const startConfirm = (row) => {
+  rowDataOne.value = row;
+  confirmDialogOne.value = true;
+  confirmFormDataOne.data = { prodOrderId: row.produceOrderId };
+  proxy
+    .post("/productionBeginConfirm/getHistoryList", {
+      prodOrderId: row.produceOrderId,
+    })
+    .then((res) => {
+      confirmFormDataOne.data.historyList = res;
+    });
+};
+
+const submitConfirmOne = (flag) => {
+  confirmFormDomOne.value.handleSubmit(() => {
+    formLoading.value = true;
+    proxy
+      .post("/productionBeginConfirm/add", confirmFormDataOne.data)
+      .then((res) => {
+        proxy.msgTip("操作成功");
+        formLoading.value = false;
+        confirmDialogOne.value = false;
+        getList();
+      });
+  });
+};
+
+const userList = ref([]);
+const getUserList = () => {
+  proxy
+    .get("/tenantUser/listAll", {
+      pageNum: 1,
+      pageSize: 10000,
+      tenantId: proxy.useUserStore().user.tenantId,
+      // companyId: proxy.useUserStore().user.companyId,
+    })
+    .then((res) => {
+      userList.value = res.rows.map((item) => {
+        return {
+          label: item.nickName,
+          value: item.userId,
+        };
+      });
+    });
+};
+getUserList();
+const changeOpUser = (val) => {
+  proxy
+    .post("/productionBeginConfirm/add", { opUserId: val })
+    .then((res) => {});
+};
 </script>
 
 <style lang="scss" scoped>

+ 138 - 34
src/views/finance/salary/become/index.vue

@@ -7,6 +7,13 @@
             action: () => openModal('add'),
           },
         ]" @get-list="getList">
+
+        <template #userName="{item}">
+          <div style="width:100%">
+            <span class="el-click" @click="getDtl(item)">{{item.userName}}</span>
+          </div>
+        </template>
+
       </byTable>
     </div>
 
@@ -18,6 +25,10 @@
         <el-button type="primary" @click="submitForm()" size="default">确 定</el-button>
       </template>
     </el-dialog>
+
+    <el-dialog title="打印" v-if="openPrint" v-model="openPrint" width="920">
+      <SalaryConfirmationPDF :rowData="rowData" @getList="getList"></SalaryConfirmationPDF>
+    </el-dialog>
   </div>
 </template>
 
@@ -28,6 +39,8 @@ import byForm from "@/components/byForm/index";
 import useUserStore from "@/store/modules/user";
 import { ElMessage, ElMessageBox } from "element-plus";
 import moment from "moment";
+import $bus from "@/bus/index.js";
+import SalaryConfirmationPDF from "@/components/PDF/SalaryConfirmationPDF.vue";
 
 const { proxy } = getCurrentInstance();
 const accountCurrency = ref([]);
@@ -41,6 +54,42 @@ const typeData = ref([
     value: "20",
   },
 ]);
+const employeeTypeData = ref([
+  {
+    label: "实习员工",
+    value: "10",
+  },
+  {
+    label: "试用员工",
+    value: "20",
+  },
+  {
+    label: "正式员工",
+    value: "30",
+  },
+]);
+const statusData = ref([
+  {
+    label: "草稿",
+    value: 0,
+  },
+  {
+    label: "审批中",
+    value: 10,
+  },
+  {
+    label: "审批驳回",
+    value: 20,
+  },
+  {
+    label: "审批通过",
+    value: 30,
+  },
+  {
+    label: "作废",
+    value: 88,
+  },
+]);
 const userList = ref([]);
 const deptData = ref([]);
 const contractorData = ref([]);
@@ -58,17 +107,27 @@ const config = computed(() => {
   return [
     {
       attrs: {
-        label: "结构名称",
-        prop: "name",
+        label: "员工姓名",
+        slot: "userName",
+        width: 100,
       },
     },
     {
       attrs: {
-        label: "是否额外收入",
-        prop: "type",
+        label: "转劳动关系",
+        prop: "employeeType",
+        width: 100,
       },
       render(val) {
-        return val == "1" ? "是" : "否";
+        return proxy.dictValueLabel(val, employeeTypeData.value);
+      },
+    },
+
+    {
+      attrs: {
+        label: "转正日期",
+        prop: "promotionDate",
+        width: 110,
       },
     },
     {
@@ -81,50 +140,61 @@ const config = computed(() => {
       attrs: {
         label: "创建时间",
         prop: "createTime",
+        width: 160,
+      },
+    },
+    {
+      attrs: {
+        label: "审批状态",
+        prop: "status",
+        width: 100,
+      },
+      render(type) {
+        return proxy.dictValueLabel(type, statusData.value);
       },
     },
     {
       attrs: {
         label: "操作",
-        width: "120",
+        width: "100",
         align: "center",
       },
       renderHTML(row) {
         return [
           {
             attrs: {
-              label: "修改",
+              label: "薪资确认单",
               type: "primary",
               text: true,
             },
             el: "button",
             click() {
-              update(row);
-            },
-          },
-          {
-            attrs: {
-              label: "删除",
-              type: "danger",
-              text: true,
-            },
-            el: "button",
-            click() {
-              proxy
-                .msgConfirm()
-                .then((res) => {
-                  proxy
-                    .post("/salaryStructure/delete", {
-                      id: row.id,
-                    })
-                    .then((res) => {
-                      proxy.msgTip("操作成功", 1);
-                      getList();
-                    });
-                })
-                .catch((err) => {});
+              clickPrint(row);
             },
           },
+          // {
+          //   attrs: {
+          //     label: "删除",
+          //     type: "danger",
+          //     text: true,
+          //   },
+          //   el: "button",
+          //   click() {
+          //     proxy
+          //       .msgConfirm()
+          //       .then((res) => {
+          //         proxy
+          //           .post("/salaryStructure/delete", {
+          //             id: row.id,
+          //           })
+          //           .then((res) => {
+          //             proxy.msgTip("操作成功", 1);
+          //             getList();
+          //           });
+          //       })
+          //       .catch((err) => {});
+          //   },
+          // },
         ];
       },
     },
@@ -135,7 +205,7 @@ const getList = async (req) => {
   sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
   loading.value = true;
   proxy
-    .post("/salaryStructure/page", sourceList.value.pagination)
+    .post("/promotionApply/page", sourceList.value.pagination)
     .then((res) => {
       sourceList.value.data = res.rows;
       sourceList.value.pagination.total = res.total;
@@ -260,9 +330,10 @@ const openModal = (val) => {
   proxy.$router.replace({
     path: "/platform_manage/process/processApproval",
     query: {
-      flowKey: "education_subsidy_flow1",
-      flowName: "员工转正申请",
+      flowKey: "promotion_apply_flow",
+      flowName: "员工转正申请流程",
       random: proxy.random(),
+      userId: proxy.useUserStore().user.userId,
     },
   });
 };
@@ -361,6 +432,39 @@ const update = (row) => {
   // });
   dialogVisible.value = true;
 };
+
+const getDtl = (row) => {
+  proxy.$router.push({
+    path: "/platform_manage/process/processApproval",
+    query: {
+      flowKey: "promotion_apply_flow",
+      flowName: "员工转正申请流程",
+      random: proxy.random(),
+      businessId: row.id,
+      processType: 20,
+    },
+  });
+};
+
+const openPrint = ref(false);
+const rowData = ref({});
+const clickPrint = (row) => {
+  rowData.value = {
+    id: row.userId,
+  };
+  openPrint.value = true;
+};
+
+onMounted(() => {
+  $bus.on("refreshTableData", () => {
+    getList();
+  });
+});
+
+onBeforeUnmount(() => {
+  // 取消订阅特定事件
+  $bus.off("refreshTableData");
+});
 </script>
 
 <style lang="scss" scoped>

+ 476 - 0
src/views/finance/salary/changeSalary/index.vue

@@ -0,0 +1,476 @@
+<template>
+  <div class="pageIndexClass">
+    <div class="content">
+      <byTable :source="sourceList.data" :pagination="sourceList.pagination" :config="config" :loading="loading" highlight-current-row :action-list="[
+          {
+            text: '添加',
+            action: () => openModal('add'),
+          },
+        ]" @get-list="getList">
+
+        <template #userName="{item}">
+          <div style="width:100%">
+            <span class="el-click" @click="getDtl(item)">{{item.userName}}</span>
+          </div>
+        </template>
+
+      </byTable>
+    </div>
+
+    <el-dialog :title="modalType == 'add' ? '添加' : '编辑'" v-if="dialogVisible" v-model="dialogVisible" width="50%">
+      <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="submit" v-loading="loadingDialog">
+      </byForm>
+      <template #footer>
+        <el-button @click="dialogVisible = false" size="default">取 消</el-button>
+        <el-button type="primary" @click="submitForm()" size="default">确 定</el-button>
+      </template>
+    </el-dialog>
+
+    <el-dialog title="打印" v-if="openPrint" v-model="openPrint" width="920">
+      <SalaryAdjustmentPDF :rowData="rowData" @getList="getList"></SalaryAdjustmentPDF>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import { computed, ref } from "vue";
+import byTable from "@/components/byTable/index";
+import byForm from "@/components/byForm/index";
+import useUserStore from "@/store/modules/user";
+import { ElMessage, ElMessageBox } from "element-plus";
+import moment from "moment";
+import $bus from "@/bus/index.js";
+import SalaryAdjustmentPDF from "@/components/PDF/SalaryAdjustmentPDF.vue";
+
+const { proxy } = getCurrentInstance();
+const accountCurrency = ref([]);
+const typeData = ref([
+  {
+    label: "收入",
+    value: "10",
+  },
+  {
+    label: "支出",
+    value: "20",
+  },
+]);
+const employeeTypeData = ref([
+  {
+    label: "实习员工",
+    value: "10",
+  },
+  {
+    label: "试用员工",
+    value: "20",
+  },
+  {
+    label: "正式员工",
+    value: "30",
+  },
+]);
+const statusData = ref([
+  {
+    label: "草稿",
+    value: 0,
+  },
+  {
+    label: "审批中",
+    value: 10,
+  },
+  {
+    label: "审批驳回",
+    value: 20,
+  },
+  {
+    label: "审批通过",
+    value: 30,
+  },
+  {
+    label: "作废",
+    value: 88,
+  },
+]);
+const userList = ref([]);
+const deptData = ref([]);
+const contractorData = ref([]);
+const sourceList = ref({
+  data: [],
+  pagination: {
+    total: 0,
+    pageNum: 1,
+    pageSize: 10,
+    keyword: "",
+  },
+});
+const loading = ref(false);
+const config = computed(() => {
+  return [
+    {
+      attrs: {
+        label: "员工姓名",
+        slot: "userName",
+        width: 100,
+      },
+    },
+    {
+      attrs: {
+        label: "劳动关系",
+        prop: "employeeType",
+        width: 100,
+      },
+      render(val) {
+        return proxy.dictValueLabel(val, employeeTypeData.value);
+      },
+    },
+    {
+      attrs: {
+        label: "考勤结算金额",
+        prop: "amount",
+        width: 120,
+      },
+    },
+    {
+      attrs: {
+        label: "记件结算金额",
+        prop: "perfAmount",
+        width: 120,
+      },
+    },
+    {
+      attrs: {
+        label: "调薪日期",
+        prop: "adjustDate",
+        width: 110,
+      },
+    },
+    {
+      attrs: {
+        label: "调薪备注",
+        prop: "adjustRemark",
+      },
+    },
+    {
+      attrs: {
+        label: "创建时间",
+        prop: "createTime",
+        width: 160,
+      },
+    },
+    {
+      attrs: {
+        label: "审批状态",
+        prop: "status",
+        width: 100,
+      },
+      render(type) {
+        return proxy.dictValueLabel(type, statusData.value);
+      },
+    },
+    {
+      attrs: {
+        label: "操作",
+        width: "100",
+        align: "center",
+      },
+      renderHTML(row) {
+        return [
+          {
+            attrs: {
+              label: "调薪申请单",
+              type: "primary",
+              text: true,
+            },
+            el: "button",
+            click() {
+              clickPrint(row);
+            },
+          },
+          // {
+          //   attrs: {
+          //     label: "删除",
+          //     type: "danger",
+          //     text: true,
+          //   },
+          //   el: "button",
+          //   click() {
+          //     proxy
+          //       .msgConfirm()
+          //       .then((res) => {
+          //         proxy
+          //           .post("/salaryStructure/delete", {
+          //             id: row.id,
+          //           })
+          //           .then((res) => {
+          //             proxy.msgTip("操作成功", 1);
+          //             getList();
+          //           });
+          //       })
+          //       .catch((err) => {});
+          //   },
+          // },
+        ];
+      },
+    },
+  ];
+});
+const corporationList = ref([]);
+const getList = async (req) => {
+  sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
+  loading.value = true;
+  proxy
+    .post("/adjustSalaryApply/page", sourceList.value.pagination)
+    .then((res) => {
+      sourceList.value.data = res.rows;
+      sourceList.value.pagination.total = res.total;
+      setTimeout(() => {
+        loading.value = false;
+      }, 200);
+    });
+};
+getList();
+
+const getDeptData = () => {
+  proxy
+    .get("/tenantUser/listAll", {
+      pageNum: 1,
+      pageSize: 10000,
+      tenantId: proxy.useUserStore().user.tenantId,
+      // companyId: proxy.useUserStore().user.companyId,
+    })
+    .then((res) => {
+      userList.value = res.rows.map((item) => {
+        return {
+          label: item.nickName,
+          value: item.userId,
+        };
+      });
+    });
+
+  proxy
+    .get("/tenantDept/list", {
+      pageNum: 1,
+      pageSize: 9999,
+      keyword: "",
+      // ancestors: proxy.useUserStore().user.companyId,
+      tenantId: proxy.useUserStore().user.tenantId,
+      // type: 2,
+    })
+    .then((res) => {
+      deptData.value = proxy.handleTree(res.data, "deptId");
+    });
+
+  proxy
+    .post("/contractor/page", {
+      pageNum: 1,
+      pageSize: 999,
+    })
+    .then((res) => {
+      contractorData.value = res.rows.map((item) => {
+        return {
+          label: item.name,
+          value: item.id,
+        };
+      });
+    });
+};
+// getDeptData();
+
+const modalType = ref("add");
+const dialogVisible = ref(false);
+const loadingDialog = ref(false);
+const submit = ref(null);
+const formOption = reactive({
+  inline: true,
+  labelWidth: 110,
+  itemWidth: 100,
+  rules: [],
+});
+const formConfig = computed(() => {
+  return [
+    {
+      type: "title1",
+      title: "基本信息",
+    },
+    {
+      type: "input",
+      prop: "name",
+      itemType: "text",
+      label: "名称",
+      itemWidth: 100,
+      disabled: false,
+    },
+    {
+      type: "radio",
+      prop: "type",
+      border: true,
+      label: "是否额外收入",
+      itemWidth: 100,
+      disabled: false,
+      data: [
+        { label: "是", value: "1" },
+        { label: "否", value: "0" },
+      ],
+    },
+    {
+      type: "input",
+      prop: "remark",
+      itemType: "textarea",
+      label: "备注",
+      itemWidth: 100,
+      disabled: false,
+    },
+  ];
+});
+const rules = ref({
+  name: [{ required: true, message: "请输入名称", trigger: "blur" }],
+  type: [{ required: true, message: "请选择是否额外收入", trigger: "change" }],
+});
+const formData = reactive({
+  data: {},
+});
+const openModal = (val) => {
+  // modalType.value = val;
+  // formData.data = {
+  //   applyTime: moment().format("YYYY-MM-DD"),
+  //   companyId: proxy.useUserStore().user.companyId,
+  //   deptId: proxy.useUserStore().user.dept.deptId,
+  //   createUser: proxy.useUserStore().user.userId,
+  //   fileList: [],
+  // };
+  // loadingDialog.value = false;
+  // dialogVisible.value = true;
+
+  proxy.$router.replace({
+    path: "/platform_manage/process/processApproval",
+    query: {
+      flowKey: "adjust_salary_apply_flow",
+      flowName: "员工调薪申请流程",
+      random: proxy.random(),
+      userId: proxy.useUserStore().user.userId,
+    },
+  });
+};
+
+const handleRemove = (index) => {
+  formData.data.accountRemainderList.splice(index, 1);
+};
+const isRepeat = (arr) => {
+  var hash = {};
+  for (var i in arr) {
+    if (hash[arr[i].currency]) return true;
+    hash[arr[i].currency] = true;
+  }
+  return false;
+};
+const submitForm = () => {
+  submit.value.handleSubmit(() => {
+    loadingDialog.value = true;
+    proxy.post("/salaryStructure/" + modalType.value, formData.data).then(
+      () => {
+        proxy.msgTip("操作成功", 1);
+        dialogVisible.value = false;
+        getList();
+      },
+      (err) => {
+        console.log(err);
+        loadingDialog.value = false;
+      }
+    );
+    // if (
+    //   formData.data.accountRemainderList &&
+    //   formData.data.accountRemainderList.length > 0
+    // ) {
+    //   if (isRepeat(formData.data.accountRemainderList)) {
+    //     return ElMessage("请勿重复添加货币余额");
+    //   } else {
+    //     loadingDialog.value = true;
+    //     proxy.post("/accountManagement/" + modalType.value, formData.data).then(
+    //       () => {
+    //         ElMessage({
+    //           message: modalType.value == "add" ? "添加成功" : "编辑成功",
+    //           type: "success",
+    //         });
+    //         dialogVisible.value = false;
+    //         getList();
+    //       },
+    //       (err) => {
+    //         console.log(err);
+    //         loadingDialog.value = false;
+    //       }
+    //     );
+    //   }
+    // } else {
+    //   return ElMessage("请添加至少一条类型余额");
+    // }
+  });
+};
+
+const update = (row) => {
+  loadingDialog.value = false;
+  modalType.value = "edit";
+  formData.data = proxy.deepClone(row);
+  // proxy.post("/epibolyBill/detail", { id: row.id }).then((res) => {
+  //   formData.data = res;
+  //   proxy
+  //     .post("/fileInfo/getList", { businessIdList: [row.id] })
+  //     .then((fileObj) => {
+  //       if (fileObj[row.id] && fileObj[row.id].length > 0) {
+  //         formData.data.fileList = fileObj[row.id]
+  //           .filter((x) => x.businessType == "0")
+  //           .map((item) => {
+  //             return {
+  //               ...item,
+  //               name: item.fileName,
+  //               url: item.fileUrl,
+  //             };
+  //           });
+  //       } else {
+  //         formData.data.fileList = [];
+  //       }
+  //     });
+  // });
+  dialogVisible.value = true;
+};
+
+const getDtl = (row) => {
+  proxy.$router.push({
+    path: "/platform_manage/process/processApproval",
+    query: {
+      flowKey: "promotion_apply_flow",
+      flowName: "员工转正申请流程",
+      random: proxy.random(),
+      businessId: row.id,
+      processType: 20,
+    },
+  });
+};
+
+const openPrint = ref(false);
+const rowData = ref({});
+const clickPrint = (row) => {
+  rowData.value = {
+    id: row.id,
+  };
+  openPrint.value = true;
+};
+
+onMounted(() => {
+  $bus.on("refreshTableData", () => {
+    getList();
+  });
+});
+
+onBeforeUnmount(() => {
+  // 取消订阅特定事件
+  $bus.off("refreshTableData");
+});
+</script>
+
+<style lang="scss" scoped>
+.tenant {
+  padding: 20px;
+}
+::v-deep(.el-input-number .el-input__inner) {
+  text-align: left;
+}
+</style>

+ 9 - 4
src/views/finance/salary/salaryManagement/index.vue

@@ -424,8 +424,8 @@ const formConfig = computed(() => {
     },
     {
       type: "number",
-      prop: "probationRatio",
-      label: "试用期薪资比例(%)",
+      prop: "internshipRatio",
+      label: "实习期薪资比例(%)",
       precision: 2,
       min: 0,
       max: 100,
@@ -437,8 +437,8 @@ const formConfig = computed(() => {
     },
     {
       type: "number",
-      prop: "internshipRatio",
-      label: "实习期薪资比例(%)",
+      prop: "probationRatio",
+      label: "试用期薪资比例(%)",
       precision: 2,
       min: 0,
       max: 100,
@@ -448,6 +448,7 @@ const formConfig = computed(() => {
         changeAmount();
       },
     },
+
     {
       type: "date",
       itemType: "date",
@@ -765,6 +766,7 @@ const update = (row) => {
   loadingDialog.value = false;
   modalType.value = "edit";
   proxy.post("/userSalaryManage/detail", { userId: row.userId }).then((res) => {
+    res.employeeType = res.employeeType + "";
     res.salaryData = {};
     if (res.userSalaryDetailList && res.userSalaryDetailList.length > 0) {
       for (let i = 0; i < res.userSalaryDetailList.length; i++) {
@@ -949,4 +951,7 @@ const handleGetDtl = (res) => {
 :deep(.table .el-input__wrapper) {
   box-shadow: none;
 }
+:deep(.table .el-input.is-disabled .el-input__wrapper) {
+  box-shadow: none !important;
+}
 </style>

+ 88 - 92
src/views/oa/application/equipmentMaintenance/index.vue

@@ -56,59 +56,59 @@ const sourceList = ref({
 const loading = ref(false);
 const config = computed(() => {
   return [
-    {
-      attrs: {
-        label: "提交人",
-        prop: "createUserName",
-        width: 130,
-      },
-    },
-    {
-      attrs: {
-        label: "提交日期",
-        prop: "applyTime",
-        width: 110,
-      },
-    },
-    {
-      attrs: {
-        label: "所属中心",
-        prop: "companyName",
-        width: 110,
-      },
-    },
-    {
-      attrs: {
-        label: "所属部门",
-        prop: "deptName",
-        width: 110,
-      },
-    },
+    // {
+    //   attrs: {
+    //     label: "提交人",
+    //     prop: "createUserName",
+    //     width: 130,
+    //   },
+    // },
+    // {
+    //   attrs: {
+    //     label: "提交日期",
+    //     prop: "applyTime",
+    //     width: 110,
+    //   },
+    // },
+    // {
+    //   attrs: {
+    //     label: "所属中心",
+    //     prop: "companyName",
+    //     width: 110,
+    //   },
+    // },
+    // {
+    //   attrs: {
+    //     label: "所属部门",
+    //     prop: "deptName",
+    //     width: 110,
+    //   },
+    // },
     {
       attrs: {
         label: "设备型号",
-        prop: "deptName",
+        prop: "deviceModel",
         // width: 110,
       },
     },
     {
       attrs: {
         label: "配件",
-        prop: "deptName",
+        prop: "partsName",
         // width: 110,
       },
     },
     {
       attrs: {
         label: "厂家",
-        prop: "deptName",
+        prop: "factoryName",
         // width: 110,
       },
     },
     {
       attrs: {
         label: "维修方案",
-        prop: "deptName",
+        prop: "schemeRemark",
         // width: 110,
       },
     },
@@ -149,7 +149,7 @@ const config = computed(() => {
     {
       attrs: {
         label: "成本费用",
-        prop: "finalAmount",
+        prop: "amount",
         width: 100,
       },
       render(val) {
@@ -194,7 +194,7 @@ const config = computed(() => {
                 .msgConfirm()
                 .then((res) => {
                   proxy
-                    .post("/epibolyBill/delete", {
+                    .post("/deviceRepair/delete", {
                       id: row.id,
                     })
                     .then((res) => {
@@ -214,7 +214,7 @@ const corporationList = ref([]);
 const getList = async (req) => {
   sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
   loading.value = true;
-  proxy.post("/epibolyBill/page", sourceList.value.pagination).then((res) => {
+  proxy.post("/deviceRepair/page", sourceList.value.pagination).then((res) => {
     sourceList.value.data = res.rows;
     sourceList.value.pagination.total = res.total;
     setTimeout(() => {
@@ -294,48 +294,48 @@ const formConfig = computed(() => {
     //   itemWidth: 50,
     //   disabled: true,
     // },
-    {
-      type: "date",
-      prop: "applyTime",
-      itemType: "date",
-      label: "提交时间",
-      itemWidth: 50,
-      disabled: false,
-    },
-    {
-      type: "select",
-      prop: "createUser",
-      label: "提交人",
-      required: true,
-      filterable: true,
-      data: userList.value,
-      itemWidth: 50,
-      disabled: true,
-    },
-    {
-      type: "treeSelect",
-      prop: "companyId",
-      label: "所属公司",
-      data: proxy.useUserStore().allDict["tree_all_company_data"],
-      propsTreeLabel: "deptName",
-      propsTreeValue: "deptId",
-      itemWidth: 50,
-      fn: (val) => {},
-      disabled: true,
-    },
-    {
-      type: "treeSelect",
-      prop: "deptId",
-      label: "所属部门",
-      data: deptData.value,
-      propsTreeLabel: "deptName",
-      propsTreeValue: "deptId",
-      itemWidth: 50,
-      disabled: true,
-    },
+    // {
+    //   type: "date",
+    //   prop: "applyTime",
+    //   itemType: "date",
+    //   label: "提交时间",
+    //   itemWidth: 50,
+    //   disabled: false,
+    // },
+    // {
+    //   type: "select",
+    //   prop: "createUser",
+    //   label: "提交人",
+    //   required: true,
+    //   filterable: true,
+    //   data: userList.value,
+    //   itemWidth: 50,
+    //   disabled: true,
+    // },
+    // {
+    //   type: "treeSelect",
+    //   prop: "companyId",
+    //   label: "所属公司",
+    //   data: proxy.useUserStore().allDict["tree_all_company_data"],
+    //   propsTreeLabel: "deptName",
+    //   propsTreeValue: "deptId",
+    //   itemWidth: 50,
+    //   fn: (val) => {},
+    //   disabled: true,
+    // },
+    // {
+    //   type: "treeSelect",
+    //   prop: "deptId",
+    //   label: "所属部门",
+    //   data: deptData.value,
+    //   propsTreeLabel: "deptName",
+    //   propsTreeValue: "deptId",
+    //   itemWidth: 50,
+    //   disabled: true,
+    // },
     {
       type: "input",
-      prop: "remark",
+      prop: "deviceModel",
       itemType: "text",
       label: "设备型号",
       itemWidth: 100,
@@ -343,7 +343,7 @@ const formConfig = computed(() => {
     },
     {
       type: "input",
-      prop: "remark",
+      prop: "partsName",
       itemType: "text",
       label: "配件",
       itemWidth: 100,
@@ -351,7 +351,7 @@ const formConfig = computed(() => {
     },
     {
       type: "input",
-      prop: "remark",
+      prop: "factoryName",
       itemType: "text",
       label: "厂家",
       itemWidth: 100,
@@ -359,7 +359,7 @@ const formConfig = computed(() => {
     },
     {
       type: "input",
-      prop: "remark",
+      prop: "schemeRemark",
       itemType: "text",
       label: "维修方案",
       itemWidth: 100,
@@ -367,7 +367,7 @@ const formConfig = computed(() => {
     },
     {
       type: "number",
-      prop: "finalAmount",
+      prop: "amount",
       label: "成本费用",
       precision: 2,
       min: 0,
@@ -404,19 +404,15 @@ const formConfig = computed(() => {
   ];
 });
 const rules = ref({
-  applyTime: [{ required: true, message: "请选择提交时间", trigger: "change" }],
-  createUser: [{ required: true, message: "请选择提交人", trigger: "change" }],
-  companyId: [{ required: true, message: "请选择所属公司", trigger: "change" }],
-  deptId: [{ required: true, message: "请选择所属部门", trigger: "change" }],
-  contractorId: [
-    { required: true, message: "请选择承包单位", trigger: "change" },
-  ],
-  accountPeriod: [{ required: true, message: "请选择账期", trigger: "change" }],
-  accountPeriodAmount: [
-    { required: true, message: "请输入账期金额", trigger: "blur" },
+  deviceModel: [{ required: true, message: "请输入设备型号", trigger: "blur" }],
+  partsName: [{ required: true, message: "请输入配件", trigger: "blur" }],
+  factoryName: [{ required: true, message: "请输入厂家", trigger: "blur" }],
+  schemeRemark: [
+    { required: true, message: "请输入维修方案", trigger: "blur" },
   ],
+  amount: [{ required: true, message: "请输入成本费用", trigger: "blur" }],
   fileList: [{ required: true, message: "请上传账单附件", trigger: "change" }],
-  remark: [{ required: true, message: "请输入说明", trigger: "blur" }],
+  // remark: [{ required: true, message: "请输入说明", trigger: "blur" }],
 });
 const formData = reactive({
   data: {},
@@ -462,7 +458,7 @@ const isRepeat = (arr) => {
 const submitForm = () => {
   submit.value.handleSubmit(() => {
     loadingDialog.value = true;
-    proxy.post("/epibolyBill/" + modalType.value, formData.data).then(
+    proxy.post("/deviceRepair/" + modalType.value, formData.data).then(
       () => {
         proxy.msgTip("操作成功", 1);
         dialogVisible.value = false;
@@ -505,7 +501,7 @@ const submitForm = () => {
 const update = (row) => {
   loadingDialog.value = false;
   modalType.value = "edit";
-  proxy.post("/epibolyBill/detail", { id: row.id }).then((res) => {
+  proxy.post("/deviceRepair/detail", { id: row.id }).then((res) => {
     formData.data = res;
     proxy
       .post("/fileInfo/getList", { businessIdList: [row.id] })

+ 354 - 0
src/views/oa/staffTask/index.vue

@@ -0,0 +1,354 @@
+
+<!-- 2无缓存,只展示代办数据 -->
+<template>
+  <div class="pageIndexClass">
+    <!-- <Banner /> -->
+    <div class="content">
+      <byTable :source="sourceList.data" :pagination="sourceList.pagination" :config="config" :loading="loading" highlight-current-row
+               :selectConfig="selectConfig" :table-events="{
+          //element talbe事件都能传
+          select: select,
+        }" @get-list="getList">
+        <template #slotName="{ item }">
+          {{ item.createTime }}
+        </template>
+        <template #nodeType="{item}">
+          <div style="width:100%">
+            <span :class="{csNode:item.nodeHandleType=='30'}"> {{dictValueLabel(item.nodeHandleType,nodeTypeData)}}</span>
+          </div>
+        </template>
+      </byTable>
+    </div>
+    <el-dialog :title="modalType == 'add' ? '新增' : '编辑'" v-model="dialogVisible" width="400" v-loading="loading">
+      <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="byform">
+      </byForm>
+      <template #footer>
+        <el-button @click="dialogVisible = false" size="default">取 消</el-button>
+        <el-button type="primary" @click="submitForm('byform')" size="default" :loading="submitLoading">
+          确 定
+        </el-button>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+    
+<script setup  name="Backlog">
+/* eslint-disable vue/no-unused-components */
+import { ElMessage, ElMessageBox } from "element-plus";
+import byTable from "@/components/byTable/index";
+import byForm from "@/components/byForm/index";
+import { computed, defineComponent, ref } from "vue";
+const loading = ref(false);
+const submitLoading = ref(false);
+const dictCommonModal = ref(false);
+const sourceList = ref({
+  data: [],
+  pagination: {
+    total: 3,
+    pageNum: 1,
+    pageSize: 10,
+    status: 1,
+  },
+});
+let dialogVisible = ref(false);
+let roomDialogVisible = ref(false);
+let modalType = ref("add");
+let rules = ref({
+  classifyName: [
+    { required: true, message: "请输入功能模块", trigger: "blur" },
+  ],
+  flowKey: [{ required: true, message: "请输入流程标识", trigger: "blur" }],
+  flowName: [{ required: true, message: "请输入流程名称", trigger: "blur" }],
+});
+const { proxy } = getCurrentInstance();
+const nodeTypeData = ref([
+  {
+    label: "常规",
+    value: "10",
+  },
+  {
+    label: "聚合",
+    value: "20",
+  },
+  {
+    label: "抄送",
+    value: "30",
+  },
+]);
+const selectConfig = computed(() => {
+  return [
+    {
+      label: "流程类型",
+      prop: "flowInfoId",
+      data: [],
+    },
+  ];
+});
+const config = computed(() => {
+  return [
+    {
+      attrs: {
+        label: "流程类型",
+        prop: "flowName",
+        width: 200,
+      },
+    },
+    {
+      attrs: {
+        label: "流程标题",
+        prop: "title",
+      },
+    },
+    {
+      attrs: {
+        label: "当前处理节点",
+        prop: "nodeName",
+        width: 160,
+      },
+    },
+    {
+      attrs: {
+        label: "当前处理人",
+        prop: "handleUserName",
+        width: 160,
+      },
+    },
+    {
+      attrs: {
+        label: "节点类型",
+        prop: "nodeType",
+        slot: "nodeType",
+        width: 100,
+      },
+    },
+    {
+      attrs: {
+        label: "流程状态",
+        width: 100,
+        prop: "status",
+      },
+      render(status) {
+        return status == 0 || status == 1
+          ? "待处理"
+          : status == 2
+          ? "已通过"
+          : "已驳回";
+      },
+    },
+    {
+      attrs: {
+        label: "发起人",
+        prop: "createUserName",
+        width: 160,
+      },
+    },
+    {
+      attrs: {
+        label: "发起时间",
+        prop: "createTime",
+        width: 160,
+      },
+    },
+    {
+      attrs: {
+        label: "操作",
+        width: "100",
+        align: "center",
+      },
+      // 渲染 el-button,一般用在最后一列。
+      renderHTML(row) {
+        return [
+          {
+            attrs: {
+              label: "查看",
+              type: "primary",
+              text: true,
+              bg: true,
+              disabled: false,
+            },
+            el: "button",
+            click() {
+              proxy.$router.push({
+                path: "/platform_manage/process/processApproval",
+                query: {
+                  flowKey: row.flowKey,
+                  id: row.id,
+                  processType: 20,
+                  version: row.version,
+                  businessId: row.businessId,
+                },
+              });
+            },
+          },
+        ];
+      },
+    },
+  ];
+});
+let dtlData = reactive({
+  data: {},
+});
+let formData = reactive({
+  data: {},
+  treeData: [],
+});
+const formOption = reactive({
+  inline: true,
+  labelWidth: 100,
+  itemWidth: 100,
+  rules: [],
+});
+const byform = ref(null);
+const treeData = ref([]);
+const formConfig = computed(() => {
+  return [
+    {
+      type: "input",
+      prop: "classifyName",
+      label: "功能模块",
+    },
+    {
+      type: "input",
+      prop: "flowKey",
+      label: "流程标识",
+      isHide: modalType.value == "edit",
+    },
+    {
+      type: "input",
+      prop: "flowName",
+      label: "流程名称",
+    },
+  ];
+});
+
+const flowJump = (row, type) => {
+  proxy
+    .post("/flowProcess/jump", {
+      flowId: row.id,
+      handleType: type,
+      version: row.version,
+      data: {},
+    })
+    .then((message) => {
+      console.log(message);
+      if (message) {
+        ElMessage.success("操作成功");
+        getList();
+      }
+    });
+};
+
+const getFlowType = () => {
+  proxy.post("/flowExample/getFlowType").then((message) => {
+    console.log(message);
+    selectConfig.value[0].data = message.map((item) => {
+      return {
+        label: item.flowName,
+        value: item.id,
+      };
+    });
+  });
+};
+getFlowType();
+const getUrlObj = {
+  1: "/flowExample/getToBeProcessedPage",
+  2: "/flowExample/getHaveInitiatedPage",
+  3: "/flowExample/getProcessedPage",
+};
+const getList = async (req) => {
+  sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
+  loading.value = true;
+  proxy
+    .post(
+      "/flowExample/getEmployeeToBeProcessedPage",
+      sourceList.value.pagination
+    )
+    .then((message) => {
+      sourceList.value.data = message.rows;
+      sourceList.value.pagination.total = message.total;
+      setTimeout(() => {
+        loading.value = false;
+      }, 200);
+    });
+};
+
+const openModal = () => {
+  dialogVisible.value = true;
+  modalType.value = "add";
+  formData.data = {};
+};
+const selection = ref({
+  data: [],
+});
+const select = (_selection, row) => {
+  selection.value.data = _selection;
+  console.log(_selection.length);
+};
+
+const tree = ref(null);
+const submitTree = () => {
+  proxy
+    .post("/tenantInfo/bindingMenu", {
+      tenantId: selection.value.data[0].tenantId,
+      menuIdList: tree.value.getCheckedKeys(),
+    })
+    .then((res) => {
+      ElMessage({
+        message: "保存成功",
+        type: "success",
+      });
+      roomDialogVisible.value = false;
+    });
+};
+
+const submitForm = () => {
+  byform.value.handleSubmit((valid) => {
+    submitLoading.value = true;
+    proxy.post("/flowInfo/" + modalType.value, formData.data).then((res) => {
+      ElMessage({
+        message: modalType.value == "add" ? "添加成功" : "编辑成功",
+        type: "success",
+      });
+      dialogVisible.value = false;
+      submitLoading.value = false;
+      getList();
+    });
+  });
+};
+
+const getDtl = (row) => {
+  formData.data = { ...row };
+  modalType.value = "edit";
+  dialogVisible.value = true;
+};
+getList();
+const changeStatus = (row) => {
+  modalType.value = "edit";
+  proxy
+    .post("/flowInfo/edit", { ...row, status: row.status === 0 ? 1 : 0 })
+    .then((res) => {
+      ElMessage({
+        message: "操作成功",
+        type: "success",
+      });
+      getList();
+    });
+};
+onMounted(() => {
+  // const route = useRoute();
+  // sourceList.value.pagination.status = route.query.type ? route.query.type : 1;
+  // getList();
+});
+</script>
+    
+  <style lang="scss" scoped>
+.tenant {
+  padding: 20px;
+}
+.csNode {
+  background: #39c55a;
+  color: #fff;
+  border-radius: 2px;
+  padding: 4px;
+}
+</style>

+ 7 - 2
src/views/process/processApproval/index.vue

@@ -82,7 +82,10 @@
         <ReviewForm ref="makeDom" v-else-if="flowForm.flowKey == 'contract_review_flow'" :queryData="queryData.data">
         </ReviewForm>
 
-        <Become ref="makeDom" v-else-if="flowForm.flowKey == 'education_subsidy_flow1'" :queryData="queryData.data"></Become>
+        <Become ref="makeDom" v-else-if="flowForm.flowKey == 'promotion_apply_flow'" :queryData="queryData.data"></Become>
+
+        <ChangeSalary ref="makeDom" v-else-if="flowForm.flowKey == 'adjust_salary_apply_flow'" :queryData="queryData.data"></ChangeSalary>
+
         <StartConfirm ref="makeDom" v-else-if="flowForm.flowKey == 'prod_begin_confirm_flow'" :queryData="queryData.data"></StartConfirm>
 
         <!-- 取消到账认领 -->
@@ -265,6 +268,7 @@ import ManualDelivery from "@/components/process/SF/ManualDelivery";
 import ReviewForm from "@/components/process/SF/ReviewForm";
 import StartConfirm from "@/components/process/SF/StartConfirm";
 import Become from "@/components/process/SF/Become";
+import ChangeSalary from "@/components/process/SF/ChangeSalary";
 
 import PurchasePayment from "@/components/process/PurchasePayment";
 import SendFunds from "@/components/process/SendFunds";
@@ -620,7 +624,8 @@ const skipPage = () => {
     invoice_apply_flow: "InvoicingApplication",
     manual_in_stock_flow: "ManualWarehousing",
     manual_out_stock_flow: "ManualDelivery",
-    education_subsidy_flow1: "Become",
+    promotion_apply_flow: "Become",
+    adjust_salary_apply_flow: "ChangeSalary",
     prod_begin_confirm_flow: "Contract",
   };
   const useTagsStore = useTagsViewStore();

+ 2 - 3
src/views/purchaseManage/purchaseManage/handoverSlip/index.vue

@@ -625,9 +625,8 @@ const onPreviewFile = (file) => {
 :deep(.el-table__header-wrapper .el-checkbox) {
   display: none;
 }
-</style>
-<style>
-.redClass {
+:deep(.redClass) {
   color: #f54a45 !important;
 }
 </style>
+

+ 2 - 3
src/views/purchaseManage/purchaseManage/handoverSlipOne/index.vue

@@ -364,9 +364,8 @@ const onPreviewFile = (file) => {
 :deep(.el-table__header-wrapper .el-checkbox) {
   display: none;
 }
-</style>
-<style>
-.redClass {
+:deep(.redClass) {
   color: #f54a45 !important;
 }
 </style>
+

+ 3 - 4
src/views/purchaseSales/stockManage/inventory/index.vue

@@ -647,12 +647,11 @@ const handleClickFile = (fileUrl) => {
 .tenant {
   padding: 20px;
 }
-</style>
-<style>
-.redClass {
+:deep(.redClass) {
   color: #f54a45 !important;
 }
-.greenClass {
+:deep(.greenClass) {
   color: #39c55a !important;
 }
 </style>
+