Parcourir la source

医社保和学历补贴开发

cz il y a 1 an
Parent
commit
ca21f1fdc0

+ 25 - 23
src/components/process/SF/Contract.vue

@@ -219,7 +219,7 @@
                     <el-table-column prop="productName" label="物料名称" width="170" />
                     <el-table-column label="规格尺寸 (cm)" width="130">
                       <template #default="{ row, $index }">
-                        <div style="width: 100%">
+                        <div style="width: 100%" v-if="row.productLength">
                           {{row.productLength}} * {{row.productWidth}} * {{row.productHeight}}
                         </div>
                       </template>
@@ -1665,27 +1665,25 @@ const selectProduct = async (goods) => {
     }
     proxy.post("/productBomInfo/detail", { id: goods.id }).then((res) => {
       if (res.productBomDetailList && res.productBomDetailList.length > 0) {
-        contractProductBomList.value = res.productBomDetailList
-          .filter((x) => x.type != 3)
-          .map((x) => ({
-            fileUrl: "",
-            materialId: x.materialId,
-            productName: x.materialName,
-            productCode: x.materialCode,
-            productLength: x.materialLength,
-            productWidth: x.materialWidth,
-            productHeight: x.materialHeight,
-            productColor: x.materialColor,
-            standardDosage: x.standardDosage,
-            lossRate: x.lossRate,
-            remark: x.remark || "",
-            quantity: null,
-            allQuantity: "",
-            price: x.materialPrice || null,
-            amount: "",
-            fileList: [],
-            type: x.type,
-          }));
+        contractProductBomList.value = res.productBomDetailList.map((x) => ({
+          fileUrl: "",
+          materialId: x.materialId,
+          productName: x.materialName,
+          productCode: x.materialCode,
+          productLength: x.materialLength,
+          productWidth: x.materialWidth,
+          productHeight: x.materialHeight,
+          productColor: x.materialColor,
+          standardDosage: x.standardDosage,
+          lossRate: x.lossRate,
+          remark: x.remark || "",
+          quantity: x.type != 3 ? null : 1,
+          allQuantity: "",
+          price: x.materialPrice || null,
+          amount: "",
+          fileList: [],
+          type: x.type,
+        }));
         let fileListOne = [];
         if (allFile && allFile.length > 0) {
           fileListOne = allFile.filter((x) => x.businessType == "2");
@@ -1849,7 +1847,11 @@ const calculationAmount = (flag = flase) => {
         for (let j = 0; j < row.contractProductBomList.length; j++) {
           let jrow = row.contractProductBomList[j];
           jrow.quantity = Math.ceil(
-            (row.quantity / jrow.standardDosage) * (1 + jrow.lossRate / 100)
+            Number(
+              parseFloat(
+                (row.quantity / jrow.standardDosage) * (1 + jrow.lossRate / 100)
+              ).toFixed(2)
+            )
           );
         }
       }

+ 256 - 0
src/components/process/SF/EducationSubsidy.vue

@@ -0,0 +1,256 @@
+<template>
+  <div style="width: 100%; padding: 0px 15px">
+    <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="formDom">
+    </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 deptData = ref([]);
+
+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: "input",
+      prop: "code",
+      label: "流水号",
+      placeholder: " ",
+      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_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: "select",
+      prop: "educationId",
+      label: "学历",
+      filterable: true,
+      multiple: false,
+      data: selectData.value,
+      itemWidth: 50,
+      fn: (val) => {
+        let current = selectData.value.find((x) => x.value == val);
+        if (current) {
+          formData.data.amount = current.amount;
+        }
+      },
+    },
+    {
+      type: "input",
+      prop: "amount",
+      itemType: "text",
+      label: "学历补贴金额",
+      itemWidth: 50,
+      disabled: true,
+    },
+    {
+      type: "upload",
+      listType: "text",
+      accept: "",
+      prop: "fileList",
+      label: "学历证明附件",
+    },
+  ];
+});
+
+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" },
+  ],
+});
+
+const getDeptData = () => {
+  proxy
+    .get("/tenantUser/list", {
+      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");
+    });
+};
+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 getAllData = (businessId) => {
+  if (businessId) {
+    proxy.post("/educationSubsidy/detail", { id: businessId }).then((res) => {
+      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 = [];
+          }
+        });
+    });
+  }
+};
+
+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;
+  if (route.query.businessId) {
+    getAllData(route.query.businessId);
+  }
+});
+</script>
+
+<style lang="scss" scoped>
+</style>

+ 280 - 0
src/components/process/SF/MedicalAndsocialSecurity.vue

@@ -0,0 +1,280 @@
+<template>
+  <div style="width: 100%; padding: 0px 15px">
+    <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="formDom">
+    </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 deptData = ref([]);
+const formData = reactive({
+  data: {
+    applyItem: [],
+    costBearing: "按照法定比例",
+    deductionMethod: "从工资中扣除",
+  },
+});
+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: 100,
+  itemWidth: 100,
+  disabled: false,
+});
+const formConfig = computed(() => {
+  return [
+    {
+      type: "title",
+      title: "基本信息",
+      haveLine: false,
+    },
+    {
+      type: "input",
+      prop: "code",
+      label: "流水号",
+      placeholder: " ",
+      itemWidth: 50,
+      disabled: true,
+    },
+    {
+      type: "select",
+      prop: "createUser",
+      label: "申请人",
+      required: true,
+      filterable: true,
+      data: userList.value,
+      itemWidth: 50,
+      disabled: true,
+    },
+    {
+      type: "date",
+      prop: "applyTime",
+      itemType: "date",
+      label: "申请日期",
+      itemWidth: 50,
+      disabled: false,
+    },
+    {
+      type: "treeSelect",
+      prop: "companyId",
+      label: "所属公司",
+      data: proxy.useUserStore().allDict["tree_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: "select",
+      prop: "applyItem",
+      label: "申请项目",
+      filterable: true,
+      multiple: true,
+      data: [
+        {
+          label: "医保",
+          value: "医保",
+        },
+        {
+          label: "社保",
+          value: "社保",
+        },
+      ],
+      itemWidth: 50,
+      fn: (val) => {},
+    },
+    {
+      type: "date",
+      prop: "entryTime",
+      itemType: "date",
+      label: "入职日期",
+      itemWidth: 50,
+      disabled: false,
+    },
+    {
+      type: "date",
+      prop: "regularTime",
+      itemType: "date",
+      label: "转正日期",
+      itemWidth: 50,
+      disabled: false,
+    },
+    {
+      type: "input",
+      prop: "costBearing",
+      itemType: "text",
+      label: "费用承担",
+      itemWidth: 50,
+      disabled: true,
+    },
+    {
+      type: "input",
+      prop: "deductionMethod",
+      itemType: "text",
+      label: "抵扣方式",
+      itemWidth: 50,
+      disabled: true,
+    },
+    {
+      type: "input",
+      prop: "remark",
+      itemType: "textarea",
+      label: "备注栏",
+      itemWidth: 100,
+      disabled: false,
+    },
+  ];
+});
+
+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" }],
+  applyItem: [{ required: true, message: "请选择申请项目", trigger: "change" }],
+  entryTime: [{ required: true, message: "请选择入职日期", trigger: "change" }],
+  regularTime: [
+    { required: true, message: "请选择转正日期", trigger: "change" },
+  ],
+  fileList: [
+    { required: true, message: "请上传学历证明附件", trigger: "change" },
+  ],
+});
+
+const getDeptData = () => {
+  proxy
+    .get("/tenantUser/list", {
+      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");
+    });
+};
+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) {
+    formData.data.applyItem = formData.data.applyItem.join(",");
+    return true;
+  }
+  let flag = await formDom.value.handleSubmit(() => {});
+  if (flag) {
+    formData.data.applyItem = formData.data.applyItem.join(",");
+    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 getAllData = (businessId) => {
+  if (businessId) {
+    proxy.post("/medicalInsurance/detail", { id: businessId }).then((res) => {
+      if (res.applyItem) {
+        res.applyItem = res.applyItem.split(",");
+      } else {
+        res.applyItem = [];
+      }
+      formData.data = res;
+    });
+  }
+};
+
+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;
+  if (route.query.businessId) {
+    getAllData(route.query.businessId);
+  }
+});
+</script>
+
+<style lang="scss" scoped>
+</style>

+ 303 - 0
src/components/process/SF/UseSeal.vue

@@ -0,0 +1,303 @@
+<template>
+  <div style="width: 100%; padding: 0px 15px">
+    <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="formDom">
+
+    </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 sealType = computed(() => proxy.useUserStore().allDict["seal_type"]);
+const userList = ref([]);
+const sss = ref([]);
+const formData = reactive({
+  data: {},
+});
+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: "input",
+      prop: "code",
+      label: "流水号",
+      itemWidth: 50,
+      disabled: true,
+    },
+    {
+      type: "select",
+      prop: "subcribeUserId",
+      label: "申请人",
+      required: true,
+      filterable: true,
+      data: userList.value,
+      itemWidth: 50,
+    },
+    {
+      type: "date",
+      prop: "subcribeTime",
+      itemType: "date",
+      label: "申请日期",
+      itemWidth: 50,
+      disabled: false,
+    },
+    {
+      type: "select",
+      prop: "subcribeUserId",
+      label: "印章名称",
+      filterable: true,
+      multiple: true,
+      data: sss.value,
+      itemWidth: 50,
+    },
+    {
+      type: "select",
+      prop: "subcribeUserId",
+      label: "使用方式",
+      filterable: true,
+      data: [
+        {
+          label: "借章",
+          value: "1",
+        },
+        {
+          label: "盖章",
+          value: "2",
+        },
+      ],
+      itemWidth: 50,
+    },
+    {
+      type: "select",
+      prop: "sealType",
+      label: "印章类型",
+      data: sealType.value,
+      itemWidth: 50,
+    },
+    {
+      type: "select",
+      prop: "subcribeUserId",
+      label: "是否盖过章",
+      filterable: true,
+      data: [
+        {
+          label: "借章",
+          value: "1",
+        },
+        {
+          label: "盖章",
+          value: "2",
+        },
+      ],
+      itemWidth: 50,
+    },
+    {
+      type: "select",
+      prop: "sealType",
+      label: "盖章类别",
+      data: sealType.value,
+      itemWidth: 50,
+    },
+    {
+      type: "upload",
+      listType: "text",
+      accept: "",
+      prop: "fileList",
+      label: "需盖章文件",
+    },
+    {
+      type: "select",
+      prop: "subcribeUserId",
+      label: "是否销售合同",
+      filterable: true,
+      data: [
+        {
+          label: "借章",
+          value: "1",
+        },
+        {
+          label: "盖章",
+          value: "2",
+        },
+      ],
+      itemWidth: 50,
+    },
+    {
+      type: "slot",
+      slotName: "btn",
+      label: "关联销售合同",
+      itemWidth: 50,
+    },
+    {
+      type: "date",
+      prop: "subcribeTime",
+      itemType: "date",
+      label: "借出日期",
+      itemWidth: 50,
+      disabled: false,
+    },
+    {
+      type: "date",
+      prop: "subcribeTime",
+      itemType: "date",
+      label: "归还日期",
+      itemWidth: 50,
+      disabled: false,
+    },
+
+    {
+      type: "input",
+      prop: "subcribeContent",
+      itemType: "textarea",
+      label: "借出用途说明",
+      itemWidth: 100,
+      disabled: false,
+    },
+  ];
+});
+
+const rules = ref({
+  companyId: [{ required: true, message: "请选择业务公司", trigger: "change" }],
+  deptId: [{ required: true, message: "请选择业务部门", trigger: "change" }],
+  subcribeUserId: [
+    { required: true, message: "请选择申请人", trigger: "change" },
+  ],
+  subcribeTime: [
+    { required: true, message: "请选择申购时间", trigger: "change" },
+  ],
+  putWarehouseId: [
+    { required: true, message: "请选择入库仓库", trigger: "change" },
+  ],
+  isSubstitute: [
+    { required: true, message: "请选择是否代他人提交", trigger: "change" },
+  ],
+  isInStock: [{ required: true, message: "请选择是否入库", trigger: "change" }],
+  isAppoint: [
+    { required: true, message: "请选择是否指定供应商", trigger: "change" },
+  ],
+  supplierId: [{ required: true, message: "请选择供应商", trigger: "change" }],
+  purposeRemark: [
+    { required: true, message: "请输入申请用途", trigger: "blur" },
+  ],
+  count: [{ required: true, message: "请输入数量", trigger: "blur" }],
+  price: [{ required: true, message: "请输入单价(不含税)", trigger: "blur" }],
+  priceIncludingTax: [
+    { required: true, message: "请输入单价(含税)", trigger: "blur" },
+  ],
+});
+
+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 getAllData = (businessId) => {
+  if (businessId) {
+    proxy.post("/subscribe/detail", { id: businessId }).then((res) => {
+      formData.data = res;
+      if (formData.data.supplierId) {
+        formData.data.isAppoint = "1";
+        changeSupplier(formData.data.supplierId);
+      } else {
+        formData.data.isAppoint = "0";
+      }
+      if (formData.data.companyId) {
+        getDeptData(formData.data.companyId);
+      }
+
+      proxy
+        .post("/fileInfo/getList", { businessIdList: [businessId] })
+        .then((fileObj) => {
+          if (fileObj[businessId] && fileObj[businessId].length > 0) {
+            formData.data.purposeFileList = fileObj[businessId]
+              .filter((x) => x.businessType == "15")
+              .map((item) => {
+                return {
+                  ...item,
+                  name: item.fileName,
+                  url: item.fileUrl,
+                };
+              });
+            formData.data.substituteFileList = fileObj[businessId]
+              .filter((x) => x.businessType == "10")
+              .map((item) => {
+                return {
+                  ...item,
+                  name: item.fileName,
+                  url: item.fileUrl,
+                };
+              });
+          } else {
+            formData.data.purposeFileList = [];
+            formData.data.substituteFileList = [];
+          }
+        });
+    });
+  }
+};
+
+onMounted(() => {
+  formOption.disabled = judgeStatus();
+  formData.data.subcribeTime = proxy.parseTime(new Date());
+  formData.data.subcribeUserId = proxy.useUserStore().user.userId;
+  if (route.query.businessId) {
+    getAllData(route.query.businessId);
+  }
+});
+</script>
+
+<style lang="scss" scoped>
+</style>

+ 1 - 0
src/views/EHSD/productLibrary/companyProduct/index.vue

@@ -1804,6 +1804,7 @@ const selectTechnology = (row) => {
       type: 3,
       materialId: x.id,
       materialName: x.name,
+      materialCode: x.code,
       quantity: null,
       standardDosage: 1,
       lossRate: null,

+ 1 - 0
src/views/EHSD/productLibrary/waitCreateProduct/index.vue

@@ -1440,6 +1440,7 @@ const selectTechnology = (row) => {
       type: 3,
       materialId: x.id,
       materialName: x.name,
+      materialCode: x.code,
       quantity: null,
       standardDosage: 1,
       lossRate: null,

+ 26 - 23
src/views/EHSD/saleContract/priceSheetEHSD/index.vue

@@ -2366,11 +2366,11 @@ const handleSubmit = (type) => {
         ) {
           return proxy.msgTip("请添加辅材", 2);
         }
-        iele.quotationProductBomList.push({
-          materialId: iele.rawMaterialId,
-          type: 1,
-          quantity: 1,
-        });
+        // iele.quotationProductBomList.push({
+        //   materialId: iele.rawMaterialId,
+        //   type: 1,
+        //   quantity: 1,
+        // });
         if (iele.packAsk) {
           iele.packAsk = iele.packAsk.join(",");
         } else {
@@ -2689,11 +2689,11 @@ const handleSubmitOne = () => {
         delete data.id;
         for (let i = 0; i < data.quotationProductList.length; i++) {
           const iele = data.quotationProductList[i];
-          iele.quotationProductBomList.push({
-            materialId: iele.rawMaterialId,
-            type: 1,
-            quantity: 1,
-          });
+          // iele.quotationProductBomList.push({
+          //   materialId: iele.rawMaterialId,
+          //   type: 1,
+          //   quantity: 1,
+          // });
           if (iele.packAsk) {
             iele.packAsk = iele.packAsk.join(",");
           } else {
@@ -2730,11 +2730,11 @@ const handleSubmitYiJia = () => {
         let data = proxy.deepClone(formData.data);
         for (let i = 0; i < data.quotationProductList.length; i++) {
           const iele = data.quotationProductList[i];
-          iele.quotationProductBomList.push({
-            materialId: iele.rawMaterialId,
-            type: 1,
-            quantity: 1,
-          });
+          // iele.quotationProductBomList.push({
+          //   materialId: iele.rawMaterialId,
+          //   type: 1,
+          //   quantity: 1,
+          // });
           if (iele.packAsk) {
             iele.packAsk = iele.packAsk.join(",");
           } else {
@@ -3063,11 +3063,11 @@ const confirmSubmit = () => {
         let data = proxy.deepClone(formData.dataTwo);
         for (let i = 0; i < data.quotationProductList.length; i++) {
           const iele = data.quotationProductList[i];
-          iele.quotationProductBomList.push({
-            materialId: iele.rawMaterialId,
-            type: 1,
-            quantity: 1,
-          });
+          // iele.quotationProductBomList.push({
+          //   materialId: iele.rawMaterialId,
+          //   type: 1,
+          //   quantity: 1,
+          // });
           if (iele.packAsk) {
             iele.packAsk = iele.packAsk.join(",");
           } else {
@@ -3249,7 +3249,7 @@ const selectRawMaterial = (row) => {
         materialHeight: row.height,
         materialColor: row.color,
         quantity: null,
-        standardDosage: null,
+        standardDosage: 1,
         lossRate: null,
         remark: "",
         price: null,
@@ -3281,8 +3281,9 @@ const selectTechnology = (row) => {
       type: 3,
       materialId: x.id,
       materialName: x.name,
+      materialCode: x.code,
       quantity: null,
-      standardDosage: null,
+      standardDosage: 1,
       lossRate: null,
       remark: "",
     }));
@@ -3305,6 +3306,7 @@ const selectTechnology = (row) => {
 };
 
 const selectMaterial = (goods) => {
+  console.log(goods, "awdwad");
   let flag = formData.data.quotationProductList[
     indexValue.value
   ].quotationProductBomList.some((x) => x.materialId == goods.id);
@@ -3323,8 +3325,9 @@ const selectMaterial = (goods) => {
       materialLength: goods["length"],
       materialWidth: goods.width,
       materialHeight: goods.height,
+      materialColor: goods.color,
       quantity: null,
-      standardDosage: null,
+      standardDosage: 1,
       lossRate: null,
       remark: "",
       price: null,

+ 2 - 2
src/views/EHSD/saleContract/priceSheetEstimate/index.vue

@@ -220,7 +220,7 @@
                     <div style="width: 100%;padding-left:15px">
                       <el-table :data="product.quotationProductBomList" style="width: 100%; margin-top: 16px">
                         <el-table-column prop="productName" label="物料名称" width="170" />
-                        <el-table-column prop="productCode" label="物料编码" width="180" />
+                        <el-table-column prop="productCode" label="物料编码" width="190" />
                         <el-table-column label="规格尺寸(cm)" width="130">
                           <template #default="{ row, $index }">
                             <div style="width: 100%" v-if="row.productLength&&row.productWidth && row.productHeight">
@@ -741,7 +741,7 @@
             <div style="width: 100%;padding-left:15px">
               <el-table :data="formData.detailsData.quotationProductBomList" style="width: 100%;">
                 <el-table-column prop="productName" label="物料名称" width="170" />
-                <el-table-column prop="productCode" label="物料编码" width="180" />
+                <el-table-column prop="productCode" label="物料编码" width="190" />
                 <el-table-column label="规格尺寸(cm)" width="130">
                   <template #default="{ row, $index }">
                     <div style="width: 100%" v-if="row.productLength&&row.productWidth && row.productHeight">

+ 487 - 0
src/views/oa/application/educationSubsidy/index.vue

@@ -0,0 +1,487 @@
+<template>
+  <div class="pageIndexClass">
+    <div class="content">
+      <byTable :source="sourceList.data" :pagination="sourceList.pagination" :selectConfig="selectConfig" :config="config" :loading="loading"
+               highlight-current-row :action-list="[
+          {
+            text: '添加',
+            action: () => openModal('add'),
+          },
+        ]" @get-list="getList">
+
+        <template #code="{item}">
+          <div style="width:100%">
+            <span class="el-click" @click="getDtl(item)">{{item.code}}</span>
+          </div>
+        </template>
+      </byTable>
+    </div>
+
+    <el-dialog :title="modalType == 'add' ? '添加' : '编辑'" v-if="dialogVisible" v-model="dialogVisible" width="60%">
+      <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>
+  </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";
+
+const { proxy } = getCurrentInstance();
+const sealType = computed(() => proxy.useUserStore().allDict["seal_type"]);
+const userList = ref([]);
+const deptData = ref([]);
+const typeData = ref([
+  {
+    label: "收入",
+    value: "10",
+  },
+  {
+    label: "支出",
+    value: "20",
+  },
+]);
+const sourceList = ref({
+  data: [],
+  pagination: {
+    total: 0,
+    pageNum: 1,
+    pageSize: 10,
+    keyword: "",
+  },
+});
+const loading = ref(false);
+const statusData = ref([
+  {
+    label: "草稿",
+    value: 0,
+  },
+  {
+    label: "审批中",
+    value: 10,
+  },
+  {
+    label: "审批驳回",
+    value: 20,
+  },
+  {
+    label: "审批通过",
+    value: 30,
+  },
+  {
+    label: "作废",
+    value: 88,
+  },
+]);
+const selectConfig = computed(() => {
+  return [
+    {
+      label: "审批状态",
+      prop: "status",
+      data: statusData.value,
+    },
+  ];
+});
+const config = computed(() => {
+  return [
+    {
+      attrs: {
+        label: "流水号",
+        slot: "code",
+      },
+    },
+
+    // {
+    //   attrs: {
+    //     label: "印章类型",
+    //     prop: "type",
+    //   },
+    //   render(val) {
+    //     return proxy.dictKeyValue(val, sealType.value);
+    //   },
+    // },
+    {
+      attrs: {
+        label: "申请人",
+        prop: "createUserName",
+      },
+    },
+    {
+      attrs: {
+        label: "申请日期",
+        prop: "applyTime",
+      },
+    },
+    {
+      attrs: {
+        label: "所属中心",
+        prop: "companyName",
+      },
+    },
+    {
+      attrs: {
+        label: "所属部门",
+        prop: "deptName",
+      },
+    },
+    {
+      attrs: {
+        label: "学历",
+        prop: "educationName",
+      },
+    },
+    {
+      attrs: {
+        label: "学历补贴金额",
+        prop: "amount",
+      },
+      render(val) {
+        return proxy.moneyFormat(val, 2);
+      },
+    },
+    {
+      attrs: {
+        label: "审批状态",
+        prop: "status",
+        width: 100,
+      },
+      render(type) {
+        return proxy.dictValueLabel(type, statusData.value);
+      },
+    },
+    {
+      attrs: {
+        label: "操作",
+        width: "120",
+        align: "center",
+      },
+      renderHTML(row) {
+        return [
+          row.status == 0
+            ? {
+                attrs: {
+                  label: "修改",
+                  type: "primary",
+                  text: true,
+                },
+                el: "button",
+                click() {
+                  clickUpdate(row);
+                },
+              }
+            : {},
+          row.status == 0
+            ? {
+                attrs: {
+                  label: "删除",
+                  type: "danger",
+                  text: true,
+                },
+                el: "button",
+                click() {
+                  proxy
+                    .msgConfirm()
+                    .then((res) => {
+                      proxy
+                        .post("/educationSubsidy/delete", {
+                          id: row.id,
+                        })
+                        .then((res) => {
+                          proxy.msgTip("操作成功", 1);
+                          getList();
+                        });
+                    })
+                    .catch((err) => {});
+                },
+              }
+            : {},
+          row.status == 10 || row.status == 30
+            ? {
+                attrs: {
+                  label: "作废",
+                  type: "danger",
+                  text: true,
+                },
+                el: "button",
+                click() {
+                  proxy
+                    .msgConfirm()
+                    .then((res) => {
+                      proxy
+                        .post("/educationSubsidy/cancellation", {
+                          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("/educationSubsidy/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 = (val) => {
+  proxy
+    .get("/tenantUser/list", {
+      pageNum: 1,
+      pageSize: 10000,
+      tenantId: proxy.useUserStore().user.tenantId,
+      companyId: proxy.useUserStore().user.companyId,
+    })
+    .then((res) => {
+      userList.value = res.rows.map((item) => {
+        return {
+          ...item,
+          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");
+    });
+};
+getDeptData();
+const modalType = ref("add");
+const dialogVisible = ref(false);
+const loadingDialog = ref(false);
+const submit = ref(null);
+const formOption = reactive({
+  inline: true,
+  labelWidth: 100,
+  itemWidth: 100,
+  rules: [],
+});
+const formConfig = computed(() => {
+  return [
+    {
+      type: "title1",
+      title: "基本信息",
+    },
+    {
+      type: "input",
+      prop: "name",
+      label: "印章名称",
+      required: true,
+      itemWidth: 50,
+      itemType: "text",
+    },
+    {
+      type: "select",
+      prop: "sealType",
+      label: "印章类型",
+      data: sealType.value,
+      itemWidth: 50,
+    },
+    {
+      type: "select",
+      prop: "applyUserId",
+      label: "存管人员",
+      required: true,
+      filterable: true,
+      data: userList.value,
+      itemWidth: 50,
+      fn: (val) => {
+        let current = userList.value.find((x) => x.value == val);
+        console.log(current, "ada");
+        if (current) {
+          formData.data.deptId = current.deptId;
+        }
+      },
+    },
+    {
+      type: "treeSelect",
+      prop: "deptId",
+      label: "存管部门",
+      data: deptData.value,
+      propsTreeLabel: "deptName",
+      propsTreeValue: "deptId",
+      itemWidth: 50,
+      disabled: 50,
+    },
+    {
+      type: "input",
+      prop: "accountNumber",
+      label: "印章用途",
+      itemWidth: 100,
+      itemType: "textarea",
+    },
+  ];
+});
+const rules = ref({
+  name: [{ required: true, message: "请输入承包商", trigger: "blur" }],
+  taxPoints: [{ required: true, message: "请输入税点", trigger: "blur" }],
+  accountBank: [{ required: true, message: "请输入开户行", trigger: "blur" }],
+  accountName: [{ required: true, message: "请输入开户名", trigger: "blur" }],
+  accountNumber: [{ required: true, message: "请输入账号", trigger: "blur" }],
+});
+const formData = reactive({
+  data: {
+    accountRemainderList: [{ currency: "", remainder: undefined }],
+  },
+});
+const openModal = (val) => {
+  // modalType.value = val;
+  // formData.data = {
+  //   accountRemainderList: [{ currency: "", remainder: undefined }],
+  // };
+  // loadingDialog.value = false;
+  // dialogVisible.value = true;
+  proxy.$router.replace({
+    path: "/platform_manage/process/processApproval",
+    query: {
+      flowKey: "education_subsidy_flow",
+      flowName: "学历补贴发起流程",
+      random: proxy.random(),
+    },
+  });
+};
+const clickBalance = () => {
+  if (
+    formData.data.accountRemainderList &&
+    formData.data.accountRemainderList.length > 0
+  ) {
+    formData.data.accountRemainderList.push({
+      currency: "",
+      remainder: undefined,
+    });
+  } else {
+    formData.data.accountRemainderList = [
+      { currency: "", remainder: undefined },
+    ];
+  }
+};
+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("/contractor/" + 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);
+  dialogVisible.value = true;
+};
+
+const clickUpdate = (row) => {
+  proxy.$router.push({
+    path: "/platform_manage/process/processApproval",
+    query: {
+      flowKey: "education_subsidy_flow",
+      flowName: "学历补贴发起流程",
+      random: proxy.random(),
+      businessId: row.id,
+    },
+  });
+};
+
+const getDtl = (row) => {
+  proxy.$router.push({
+    path: "/platform_manage/process/processApproval",
+    query: {
+      flowKey: "education_subsidy_flow",
+      flowName: "学历补贴流程查看",
+      random: proxy.random(),
+      businessId: row.id,
+      processType: 20,
+    },
+  });
+};
+</script>
+
+<style lang="scss" scoped>
+.tenant {
+  padding: 20px;
+}
+::v-deep(.el-input-number .el-input__inner) {
+  text-align: left;
+}
+</style>

+ 502 - 0
src/views/oa/application/medicalAndsocialSecurity/index.vue

@@ -0,0 +1,502 @@
+<template>
+  <div class="pageIndexClass">
+    <div class="content">
+      <byTable :source="sourceList.data" :pagination="sourceList.pagination" :selectConfig="selectConfig" :config="config" :loading="loading"
+               highlight-current-row :action-list="[
+          {
+            text: '添加',
+            action: () => openModal('add'),
+          },
+        ]" @get-list="getList">
+
+        <template #code="{item}">
+          <div style="width:100%">
+            <span class="el-click" @click="getDtl(item)">{{item.code}}</span>
+          </div>
+        </template>
+      </byTable>
+    </div>
+
+    <el-dialog :title="modalType == 'add' ? '添加' : '编辑'" v-if="dialogVisible" v-model="dialogVisible" width="60%">
+      <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>
+  </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";
+
+const { proxy } = getCurrentInstance();
+const sealType = computed(() => proxy.useUserStore().allDict["seal_type"]);
+const userList = ref([]);
+const deptData = ref([]);
+const typeData = ref([
+  {
+    label: "收入",
+    value: "10",
+  },
+  {
+    label: "支出",
+    value: "20",
+  },
+]);
+const sourceList = ref({
+  data: [],
+  pagination: {
+    total: 0,
+    pageNum: 1,
+    pageSize: 10,
+    keyword: "",
+  },
+});
+const loading = ref(false);
+const statusData = ref([
+  {
+    label: "草稿",
+    value: 0,
+  },
+  {
+    label: "审批中",
+    value: 10,
+  },
+  {
+    label: "审批驳回",
+    value: 20,
+  },
+  {
+    label: "审批通过",
+    value: 30,
+  },
+  {
+    label: "作废",
+    value: 88,
+  },
+]);
+const selectConfig = computed(() => {
+  return [
+    {
+      label: "审批状态",
+      prop: "status",
+      data: statusData.value,
+    },
+  ];
+});
+const config = computed(() => {
+  return [
+    {
+      attrs: {
+        label: "流水号",
+        slot: "code",
+      },
+    },
+
+    // {
+    //   attrs: {
+    //     label: "印章类型",
+    //     prop: "type",
+    //   },
+    //   render(val) {
+    //     return proxy.dictKeyValue(val, sealType.value);
+    //   },
+    // },
+    {
+      attrs: {
+        label: "申请人",
+        prop: "createUserName",
+      },
+    },
+    {
+      attrs: {
+        label: "申请日期",
+        prop: "applyTime",
+      },
+    },
+    {
+      attrs: {
+        label: "所属中心",
+        prop: "companyName",
+      },
+    },
+    {
+      attrs: {
+        label: "所属部门",
+        prop: "deptName",
+      },
+    },
+    {
+      attrs: {
+        label: "申请项目",
+        prop: "applyItem",
+      },
+    },
+    {
+      attrs: {
+        label: "入职日期",
+        prop: "entryTime",
+      },
+    },
+    {
+      attrs: {
+        label: "转正日期",
+        prop: "regularTime",
+      },
+    },
+    {
+      attrs: {
+        label: "费用承担",
+        prop: "costBearing",
+      },
+    },
+    {
+      attrs: {
+        label: "抵扣方式",
+        prop: "deductionMethod",
+      },
+    },
+    {
+      attrs: {
+        label: "审批状态",
+        prop: "status",
+        width: 100,
+      },
+      render(type) {
+        return proxy.dictValueLabel(type, statusData.value);
+      },
+    },
+    {
+      attrs: {
+        label: "操作",
+        width: "120",
+        align: "center",
+      },
+      renderHTML(row) {
+        return [
+          row.status == 0
+            ? {
+                attrs: {
+                  label: "修改",
+                  type: "primary",
+                  text: true,
+                },
+                el: "button",
+                click() {
+                  clickUpdate(row);
+                },
+              }
+            : {},
+          row.status == 0
+            ? {
+                attrs: {
+                  label: "删除",
+                  type: "danger",
+                  text: true,
+                },
+                el: "button",
+                click() {
+                  proxy
+                    .msgConfirm()
+                    .then((res) => {
+                      proxy
+                        .post("/medicalInsurance/delete", {
+                          id: row.id,
+                        })
+                        .then((res) => {
+                          proxy.msgTip("操作成功", 1);
+                          getList();
+                        });
+                    })
+                    .catch((err) => {});
+                },
+              }
+            : {},
+          row.status == 10 || row.status == 30
+            ? {
+                attrs: {
+                  label: "作废",
+                  type: "danger",
+                  text: true,
+                },
+                el: "button",
+                click() {
+                  proxy
+                    .msgConfirm()
+                    .then((res) => {
+                      proxy
+                        .post("/medicalInsurance/cancellation", {
+                          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("/medicalInsurance/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 = (val) => {
+  proxy
+    .get("/tenantUser/list", {
+      pageNum: 1,
+      pageSize: 10000,
+      tenantId: proxy.useUserStore().user.tenantId,
+      companyId: proxy.useUserStore().user.companyId,
+    })
+    .then((res) => {
+      userList.value = res.rows.map((item) => {
+        return {
+          ...item,
+          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");
+    });
+};
+getDeptData();
+const modalType = ref("add");
+const dialogVisible = ref(false);
+const loadingDialog = ref(false);
+const submit = ref(null);
+const formOption = reactive({
+  inline: true,
+  labelWidth: 100,
+  itemWidth: 100,
+  rules: [],
+});
+const formConfig = computed(() => {
+  return [
+    {
+      type: "title1",
+      title: "基本信息",
+    },
+    {
+      type: "input",
+      prop: "name",
+      label: "印章名称",
+      required: true,
+      itemWidth: 50,
+      itemType: "text",
+    },
+    {
+      type: "select",
+      prop: "sealType",
+      label: "印章类型",
+      data: sealType.value,
+      itemWidth: 50,
+    },
+    {
+      type: "select",
+      prop: "applyUserId",
+      label: "存管人员",
+      required: true,
+      filterable: true,
+      data: userList.value,
+      itemWidth: 50,
+      fn: (val) => {
+        let current = userList.value.find((x) => x.value == val);
+        console.log(current, "ada");
+        if (current) {
+          formData.data.deptId = current.deptId;
+        }
+      },
+    },
+    {
+      type: "treeSelect",
+      prop: "deptId",
+      label: "存管部门",
+      data: deptData.value,
+      propsTreeLabel: "deptName",
+      propsTreeValue: "deptId",
+      itemWidth: 50,
+      disabled: 50,
+    },
+    {
+      type: "input",
+      prop: "accountNumber",
+      label: "印章用途",
+      itemWidth: 100,
+      itemType: "textarea",
+    },
+  ];
+});
+const rules = ref({
+  name: [{ required: true, message: "请输入承包商", trigger: "blur" }],
+  taxPoints: [{ required: true, message: "请输入税点", trigger: "blur" }],
+  accountBank: [{ required: true, message: "请输入开户行", trigger: "blur" }],
+  accountName: [{ required: true, message: "请输入开户名", trigger: "blur" }],
+  accountNumber: [{ required: true, message: "请输入账号", trigger: "blur" }],
+});
+const formData = reactive({
+  data: {
+    accountRemainderList: [{ currency: "", remainder: undefined }],
+  },
+});
+const openModal = (val) => {
+  // modalType.value = val;
+  // formData.data = {
+  //   accountRemainderList: [{ currency: "", remainder: undefined }],
+  // };
+  // loadingDialog.value = false;
+  // dialogVisible.value = true;
+  proxy.$router.replace({
+    path: "/platform_manage/process/processApproval",
+    query: {
+      flowKey: "medical_insurance_flow",
+      flowName: "医社保发起流程",
+      random: proxy.random(),
+    },
+  });
+};
+const clickBalance = () => {
+  if (
+    formData.data.accountRemainderList &&
+    formData.data.accountRemainderList.length > 0
+  ) {
+    formData.data.accountRemainderList.push({
+      currency: "",
+      remainder: undefined,
+    });
+  } else {
+    formData.data.accountRemainderList = [
+      { currency: "", remainder: undefined },
+    ];
+  }
+};
+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("/contractor/" + 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);
+  dialogVisible.value = true;
+};
+
+const clickUpdate = (row) => {
+  proxy.$router.push({
+    path: "/platform_manage/process/processApproval",
+    query: {
+      flowKey: "medical_insurance_flow",
+      flowName: "医社保发起流程",
+      random: proxy.random(),
+      businessId: row.id,
+    },
+  });
+};
+
+const getDtl = (row) => {
+  proxy.$router.push({
+    path: "/platform_manage/process/processApproval",
+    query: {
+      flowKey: "medical_insurance_flow",
+      flowName: "医社保流程查看",
+      random: proxy.random(),
+      businessId: row.id,
+      processType: 20,
+    },
+  });
+};
+</script>
+
+<style lang="scss" scoped>
+.tenant {
+  padding: 20px;
+}
+::v-deep(.el-input-number .el-input__inner) {
+  text-align: left;
+}
+</style>

+ 353 - 0
src/views/oa/application/sealManage/index.vue

@@ -0,0 +1,353 @@
+<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">
+      </byTable>
+    </div>
+
+    <el-dialog :title="modalType == 'add' ? '添加' : '编辑'" v-if="dialogVisible" v-model="dialogVisible" width="60%">
+      <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>
+  </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";
+
+const { proxy } = getCurrentInstance();
+const sealType = computed(() => proxy.useUserStore().allDict["seal_type"]);
+const userList = ref([]);
+const deptData = ref([]);
+const typeData = ref([
+  {
+    label: "收入",
+    value: "10",
+  },
+  {
+    label: "支出",
+    value: "20",
+  },
+]);
+const sourceList = ref({
+  data: [],
+  pagination: {
+    total: 0,
+    pageNum: 1,
+    pageSize: 10,
+    keyword: "",
+  },
+});
+const loading = ref(false);
+const config = computed(() => {
+  return [
+    {
+      attrs: {
+        label: "印章名称",
+        prop: "name",
+      },
+    },
+
+    {
+      attrs: {
+        label: "印章类型",
+        prop: "type",
+      },
+      render(val) {
+        return proxy.dictKeyValue(val, sealType.value);
+      },
+    },
+    {
+      attrs: {
+        label: "存管人员",
+        prop: "accountBank",
+      },
+    },
+    {
+      attrs: {
+        label: "存管部门",
+        prop: "accountName",
+      },
+    },
+    {
+      attrs: {
+        label: "印章用途",
+        prop: "印章用途",
+      },
+    },
+    {
+      attrs: {
+        label: "操作",
+        width: "120",
+        align: "center",
+      },
+      renderHTML(row) {
+        return [
+          {
+            attrs: {
+              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("/contractor/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("/contractor/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 = (val) => {
+  proxy
+    .get("/tenantUser/list", {
+      pageNum: 1,
+      pageSize: 10000,
+      tenantId: proxy.useUserStore().user.tenantId,
+      companyId: proxy.useUserStore().user.companyId,
+    })
+    .then((res) => {
+      userList.value = res.rows.map((item) => {
+        return {
+          ...item,
+          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");
+    });
+};
+getDeptData();
+const modalType = ref("add");
+const dialogVisible = ref(false);
+const loadingDialog = ref(false);
+const submit = ref(null);
+const formOption = reactive({
+  inline: true,
+  labelWidth: 100,
+  itemWidth: 100,
+  rules: [],
+});
+const formConfig = computed(() => {
+  return [
+    {
+      type: "title1",
+      title: "基本信息",
+    },
+    {
+      type: "input",
+      prop: "name",
+      label: "印章名称",
+      required: true,
+      itemWidth: 50,
+      itemType: "text",
+    },
+    {
+      type: "select",
+      prop: "sealType",
+      label: "印章类型",
+      data: sealType.value,
+      itemWidth: 50,
+    },
+    {
+      type: "select",
+      prop: "applyUserId",
+      label: "存管人员",
+      required: true,
+      filterable: true,
+      data: userList.value,
+      itemWidth: 50,
+      fn: (val) => {
+        let current = userList.value.find((x) => x.value == val);
+        console.log(current, "ada");
+        if (current) {
+          formData.data.deptId = current.deptId;
+        }
+      },
+    },
+    {
+      type: "treeSelect",
+      prop: "deptId",
+      label: "存管部门",
+      data: deptData.value,
+      propsTreeLabel: "deptName",
+      propsTreeValue: "deptId",
+      itemWidth: 50,
+      disabled: 50,
+    },
+    {
+      type: "input",
+      prop: "accountNumber",
+      label: "印章用途",
+      itemWidth: 100,
+      itemType: "textarea",
+    },
+  ];
+});
+const rules = ref({
+  name: [{ required: true, message: "请输入承包商", trigger: "blur" }],
+  taxPoints: [{ required: true, message: "请输入税点", trigger: "blur" }],
+  accountBank: [{ required: true, message: "请输入开户行", trigger: "blur" }],
+  accountName: [{ required: true, message: "请输入开户名", trigger: "blur" }],
+  accountNumber: [{ required: true, message: "请输入账号", trigger: "blur" }],
+});
+const formData = reactive({
+  data: {
+    accountRemainderList: [{ currency: "", remainder: undefined }],
+  },
+});
+const openModal = (val) => {
+  modalType.value = val;
+  formData.data = {
+    accountRemainderList: [{ currency: "", remainder: undefined }],
+  };
+  loadingDialog.value = false;
+  dialogVisible.value = true;
+};
+const clickBalance = () => {
+  if (
+    formData.data.accountRemainderList &&
+    formData.data.accountRemainderList.length > 0
+  ) {
+    formData.data.accountRemainderList.push({
+      currency: "",
+      remainder: undefined,
+    });
+  } else {
+    formData.data.accountRemainderList = [
+      { currency: "", remainder: undefined },
+    ];
+  }
+};
+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("/contractor/" + 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);
+  dialogVisible.value = true;
+};
+</script>
+
+<style lang="scss" scoped>
+.tenant {
+  padding: 20px;
+}
+::v-deep(.el-input-number .el-input__inner) {
+  text-align: left;
+}
+</style>

+ 264 - 0
src/views/oa/application/subsidyAmount/index.vue

@@ -0,0 +1,264 @@
+<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">
+      </byTable>
+    </div>
+
+    <el-dialog :title="modalType == 'add' ? '添加' : '编辑'" v-if="dialogVisible" v-model="dialogVisible" width="500">
+      <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>
+  </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";
+
+const { proxy } = getCurrentInstance();
+const accountCurrency = ref([]);
+const typeData = ref([
+  {
+    label: "收入",
+    value: "10",
+  },
+  {
+    label: "支出",
+    value: "20",
+  },
+]);
+const sourceList = ref({
+  data: [],
+  pagination: {
+    total: 0,
+    pageNum: 1,
+    pageSize: 10,
+    keyword: "",
+  },
+});
+const loading = ref(false);
+const config = computed(() => {
+  return [
+    {
+      attrs: {
+        label: "学历名称",
+        prop: "name",
+      },
+    },
+    {
+      attrs: {
+        label: "学历补贴金额",
+        prop: "amount",
+      },
+      render(val) {
+        return proxy.moneyFormat(val, 2);
+      },
+    },
+    {
+      attrs: {
+        label: "操作",
+        width: "120",
+        align: "center",
+      },
+      renderHTML(row) {
+        return [
+          {
+            attrs: {
+              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("/educationConfig/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("/educationConfig/page", sourceList.value.pagination)
+    .then((res) => {
+      sourceList.value.data = res.rows;
+      sourceList.value.pagination.total = res.total;
+      setTimeout(() => {
+        loading.value = false;
+      }, 200);
+    });
+};
+getList();
+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",
+      label: "学历名称",
+      required: true,
+      itemWidth: 100,
+      itemType: "text",
+    },
+    {
+      type: "number",
+      prop: "amount",
+      label: "学历补贴金额",
+      precision: 2,
+      min: 0,
+      // max: 100,
+      controls: false,
+      itemWidth: 100,
+    },
+  ];
+});
+const rules = ref({
+  name: [{ required: true, message: "请输入学历名称", trigger: "blur" }],
+  amount: [{ required: true, message: "请输入学历补贴金额", trigger: "blur" }],
+});
+const formData = reactive({
+  data: {},
+});
+const openModal = (val) => {
+  modalType.value = val;
+  formData.data = {};
+  loadingDialog.value = false;
+  dialogVisible.value = true;
+};
+const clickBalance = () => {
+  if (
+    formData.data.accountRemainderList &&
+    formData.data.accountRemainderList.length > 0
+  ) {
+    formData.data.accountRemainderList.push({
+      currency: "",
+      remainder: undefined,
+    });
+  } else {
+    formData.data.accountRemainderList = [
+      { currency: "", remainder: undefined },
+    ];
+  }
+};
+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("/educationConfig/" + 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);
+  dialogVisible.value = true;
+};
+</script>
+
+<style lang="scss" scoped>
+.tenant {
+  padding: 20px;
+}
+::v-deep(.el-input-number .el-input__inner) {
+  text-align: left;
+}
+</style>

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

@@ -52,6 +52,12 @@
         <SendFunds ref="makeDom" v-else-if="flowForm.flowKey == 'account_request_funds_flow'" :queryData="queryData.data"></SendFunds>
 
         <ReturnGood ref="makeDom" v-else-if="flowForm.flowKey == 'purchase_back_flow'" :queryData="queryData.data"></ReturnGood>
+
+        <EducationSubsidy ref="makeDom" v-else-if="flowForm.flowKey == 'education_subsidy_flow'" :queryData="queryData.data"></EducationSubsidy>
+
+        <MedicalAndsocialSecurity ref="makeDom" v-else-if="flowForm.flowKey == 'medical_insurance_flow'" :queryData="queryData.data">
+        </MedicalAndsocialSecurity>
+
         <!-- 取消到账认领 -->
         <!-- <CancelClaim ref="makeDom" v-else-if="flowForm.flowKey == 'claim_del_flow'" :queryData="queryData.data"></CancelClaim> -->
       </div>
@@ -209,6 +215,8 @@ import Subscribe from "@/components/process/SF/Subscribe";
 import Purchase from "@/components/process/SF/Purchase";
 import PurchaseChange from "@/components/process/SF/PurchaseChange";
 import ReturnGood from "@/components/process/SF/ReturnGood";
+import EducationSubsidy from "@/components/process/SF/EducationSubsidy";
+import MedicalAndsocialSecurity from "@/components/process/SF/MedicalAndsocialSecurity";
 
 import PurchasePayment from "@/components/process/PurchasePayment";
 import SendFunds from "@/components/process/SendFunds";
@@ -230,7 +238,12 @@ const route = useRoute();
 const props = defineProps({
   query: Object,
 });
-const StagFlowKey = ref(["contract_flow", "cost_control_flow"]);
+const StagFlowKey = ref([
+  "contract_flow",
+  "cost_control_flow",
+  "education_subsidy_flow",
+  "medical_insurance_flow",
+]);
 // tab切换逻辑
 const activeName = ref("first");
 let auxiliaryData = ref([]);
@@ -408,12 +421,6 @@ const handleSubmitStag = async (_type) => {
         btnLoading.value = true;
         if (valid) {
           const data = { ...makeDom.value.getFormData() };
-          flowForm.fileList = flowForm.fileList.map((item) => {
-            return {
-              ...item,
-              ...item.raw,
-            };
-          });
           if (flowForm.flowKey == "contract_flow") {
             proxy.post("/contract/add", data).then(
               (res) => {
@@ -432,6 +439,24 @@ const handleSubmitStag = async (_type) => {
                 btnLoading.value = false;
               }
             );
+          } else if (flowForm.flowKey == "education_subsidy_flow") {
+            proxy.post("/educationSubsidy/add", data).then(
+              (res) => {
+                skipPage();
+              },
+              (err) => {
+                btnLoading.value = false;
+              }
+            );
+          } else if (flowForm.flowKey == "medical_insurance_flow") {
+            proxy.post("/medicalInsurance/add", data).then(
+              (res) => {
+                skipPage();
+              },
+              (err) => {
+                btnLoading.value = false;
+              }
+            );
           }
         }
       });
@@ -457,6 +482,8 @@ const skipPage = () => {
     after_sales_flow: "AfterSales",
     sales_outbound_approved_flow: "Contract",
     cost_control_flow: "CostControl",
+    education_subsidy_flow: "EducationSubsidy",
+    medical_insurance_flow: "MedicalAndsocialSecurity",
   };
   const useTagsStore = useTagsViewStore();
   useTagsStore.delVisitedView(router.currentRoute.value);