Kaynağa Gözat

订单评审表、开工确认

cz 10 ay önce
ebeveyn
işleme
d9f95606aa

+ 448 - 0
src/components/PDF/ReviewFormPDF.vue

@@ -0,0 +1,448 @@
+<template>
+  <div style="width:840px;position:relative;left:50%;transform:translateX(-50%)">
+    <div id="pdfDom" ref="pdfDom" style="padding: 0px 20px; text-align: center;font-size:12px;color:#000;" v-loading="loading">
+      <div class="title">
+        福建三梵体育用品实业有限公司
+      </div>
+      <div class="title-info">
+        评审表
+      </div>
+      <div style="margin-bottom:10px;text-align:left">
+        <div style="display:flex">
+          <div>
+            订单状况:
+          </div>
+          <div class="checkBoxDiv" style="flex:1;margin-top:-3px">
+            <CheckBox :isCheck="pdfData.contractPlaceOrderType==10" label="首次订单" />
+            (样品确认:
+            <CheckBox :isCheck="pdfData.isSampleRecognize==1" label="是" />
+            <CheckBox :isCheck="pdfData.isSampleRecognize==0" label="否" />)
+          </div>
+          <div class="checkBoxDiv" style="flex:1;margin-top:-3px">
+            <CheckBox :isCheck="pdfData.contractPlaceOrderType==20" label="客户返单" />
+            (工程变更:
+            <CheckBox :isCheck="pdfData.isProjectChang==1" label="是" />
+            <CheckBox :isCheck="pdfData.isProjectChang==0" label="否" />)
+          </div>
+        </div>
+      </div>
+      <table border="1" style="width: 100%" class="table">
+        <tr>
+          <td colspan="2">客户名称</td>
+          <td>{{pdfData.customerName}}</td>
+          <td>下单日期</td>
+          <td>{{pdfData.contractCreateTime}}</td>
+          <td>产品编码</td>
+          <td>{{pdfData.productCode}}</td>
+          <td>颜色</td>
+          <td>{{pdfData.productColor}}</td>
+        </tr>
+        <tr>
+          <td colspan="2">订单号</td>
+          <td>{{pdfData.contractCode}}</td>
+          <td>交货日期</td>
+          <td>{{pdfData.contractDeliveryTime}}</td>
+          <td>产品名称</td>
+          <td>{{pdfData.productName}}</td>
+          <td>材质</td>
+          <td>{{pdfData.productMaterial}}</td>
+        </tr>
+        <tr>
+          <td colspan="2">业务员</td>
+          <td>{{pdfData.salesmanName}}</td>
+          <td>订单数量</td>
+          <td>{{pdfData.quantity}}</td>
+          <td>产品尺寸(cm)</td>
+          <td>
+            {{pdfData.productLength}}*{{pdfData.productWidth}}*{{pdfData.productHeight}}
+          </td>
+          <td>
+          </td>
+          <td>
+          </td>
+        </tr>
+        <tr>
+          <td colspan="2">环保要求</td>
+          <td colspan="3">
+            <div class="checkBoxDiv">
+              <CheckBox :isCheck="pdfData.isEcoFriendly==1" label="环保产品" />
+              <CheckBox :isCheck="pdfData.isEcoFriendly==0" label="非环保产品" />
+            </div>
+          </td>
+          <td>附出货报告</td>
+          <td colspan="3">
+            <div class="checkBoxDiv">
+              <CheckBox :isCheck="pdfData.isShippingReport==1" label="是" />
+              <CheckBox :isCheck="pdfData.isShippingReport==0" label="否" />
+            </div>
+          </td>
+        </tr>
+        <tr>
+          <td colspan="2">运输方式</td>
+          <td colspan="3">
+            <div class="checkBoxDiv">
+              <CheckBox :isCheck="pdfData.transportMethod==1" label="快递" />
+              <CheckBox :isCheck="pdfData.transportMethod==0" label="送货" />
+            </div>
+          </td>
+          <td>品质要求</td>
+          <td colspan="3">
+            <div class="checkBoxDiv">
+              <CheckBox :isCheck="pdfData.contractQualityLv==1" label="电商" />
+              <CheckBox :isCheck="pdfData.contractQualityLv==0" label="品牌" />
+            </div>
+          </td>
+        </tr>
+        <!-- 信息组 -->
+        <tr>
+          <td rowspan="3" style="width:4%">信息组</td>
+          <td style="width:12%">BOM表</td>
+          <td style="width:12%">
+            <div class="checkBoxDiv">
+              <CheckBox :isCheck="pdfData.isBomTable==1" label="有" />
+              <CheckBox :isCheck="pdfData.isBomTable==0" label="否" />
+            </div>
+          </td>
+          <td style="width:12%">确认样品</td>
+          <td style="width:12%">
+            <div class="checkBoxDiv">
+              <CheckBox :isCheck="pdfData.isSampleConfirm==1" label="有" />
+              <CheckBox :isCheck="pdfData.isSampleConfirm==0" label="否" />
+            </div>
+          </td>
+          <td style="width:12%">工艺流程图</td>
+          <td style="width:12%">
+            <div class="checkBoxDiv">
+              <CheckBox :isCheck="pdfData.isTechnologyProcess==1" label="有" />
+              <CheckBox :isCheck="pdfData.isTechnologyProcess==0" label="否" />
+            </div>
+          </td>
+          <td style="width:12%">刀模完成</td>
+          <td style="width:12%">
+            <div class="checkBoxDiv">
+              <CheckBox :isCheck="pdfData.isKnifeMold==1" label="有" />
+              <CheckBox :isCheck="pdfData.isKnifeMold==0" label="否" />
+            </div>
+          </td>
+        </tr>
+        <tr>
+          <td>图纸完成</td>
+          <td>
+            <div class="checkBoxDiv">
+              <CheckBox :isCheck="pdfData.isDrawing==1" label="有" />
+              <CheckBox :isCheck="pdfData.isDrawing==0" label="否" />
+            </div>
+          </td>
+          <td>颜色样品</td>
+          <td>
+            <div class="checkBoxDiv">
+              <CheckBox :isCheck="pdfData.isColorSample==1" label="有" />
+              <CheckBox :isCheck="pdfData.isColorSample==0" label="否" />
+            </div>
+          </td>
+          <td>包装要求</td>
+          <td>
+            <div class="checkBoxDiv">
+              <CheckBox :isCheck="pdfData.isPackInfo==1" label="有" />
+              <CheckBox :isCheck="pdfData.isPackInfo==0" label="否" />
+            </div>
+          </td>
+          <td></td>
+          <td></td>
+        </tr>
+        <tr>
+          <td>特殊要求</td>
+          <td colspan="7" class="td-left">
+            {{pdfData.specialRemark}}
+            <div style="text-align:right;padding-right:100px">
+              工程签字:
+            </div>
+          </td>
+        </tr>
+        <!-- 采购组 -->
+        <tr>
+          <td rowspan="3">采购部</td>
+          <td>主材交期</td>
+          <td colspan="3">
+            {{pdfData.mainMaterialTime}}
+          </td>
+          <td>包材交期</td>
+          <td colspan="3">
+            {{pdfData.packMaterialTime}}
+          </td>
+        </tr>
+        <tr>
+          <td>辅材交期</td>
+          <td colspan="3">
+            {{pdfData.auxMaterialTime}}
+          </td>
+          <td>其他交期</td>
+          <td colspan="3">
+            {{pdfData.otherMaterialTime}}
+          </td>
+        </tr>
+        <tr>
+          <td>注意事项</td>
+          <td colspan="7" class="td-left">
+            {{pdfData.purchaseRemark}}
+            <div style="text-align:right;padding-right:100px">
+              采购签字:
+            </div>
+          </td>
+        </tr>
+        <!-- 生产组 -->
+        <tr>
+          <td :rowspan="7+pdfData.rowSpan">生产部</td>
+          <td rowspan="3">生产资源评估</td>
+          <td>人员评估</td>
+          <td colspan="6">
+            <div class="checkBoxDiv">
+              <CheckBox :isCheck="pdfData.personnelEval==10" label="现有人员能满足" />
+              <CheckBox :isCheck="pdfData.personnelEval==20" label="现有人员不能满足,需调整加班时间或建议招聘临时工" />
+            </div>
+          </td>
+        </tr>
+        <tr>
+          <td>设备评估</td>
+          <td colspan="6">
+            <div class="checkBoxDiv">
+              <CheckBox :isCheck="pdfData.deviceEval==10" label="现有设备能满足" />
+              <CheckBox :isCheck="pdfData.deviceEval==20" label="现有设备不能满足,需新增设各或建议委外" />
+            </div>
+          </td>
+        </tr>
+        <tr>
+          <td>工艺评估</td>
+          <td colspan="6">
+            <div class="checkBoxDiv">
+              <CheckBox :isCheck="pdfData.technologyEval==20" label="现有工艺不能满足" />
+              <CheckBox :isCheck="pdfData.technologyEval==10" label="现有工艺能满足,需沟通修改工艺流程" />
+            </div>
+          </td>
+        </tr>
+
+        <template v-if="pdfData.contractProductBomList && pdfData.contractProductBomList.length>0">
+          <tr v-for="(row,index) in  pdfData.rowSpan">
+            <td :rowspan="pdfData.rowSpan+1" v-if="index==0">工序交期</td>
+            <template v-if="index==0">
+              <td>{{pdfData.contractProductBomList[row].productName}}交期</td>
+              <td>
+                {{pdfData.contractProductBomList[row].deliveryTime}}
+              </td>
+              <td>{{pdfData.contractProductBomList[row+1].productName}}交期</td>
+              <td>
+                {{pdfData.contractProductBomList[row+1].deliveryTime}}
+              </td>
+              <td>{{pdfData.contractProductBomList[row+2].productName}}交期</td>
+              <td colspan="2">
+                {{pdfData.contractProductBomList[row+2].deliveryTime}}
+              </td>
+            </template>
+            <template v-else>
+              <td>{{pdfData.contractProductBomList[1+(row-1)*3].productName}}交期</td>
+              <td>
+                {{pdfData.contractProductBomList[1+(row-1)*3].deliveryTime}}
+              </td>
+              <td>{{pdfData.contractProductBomList[2+(row-1)*3].productName}}交期</td>
+              <td>
+                {{pdfData.contractProductBomList[2+(row-1)*3].deliveryTime}}
+              </td>
+              <td>{{pdfData.contractProductBomList[3+(row-1)*3].productName}}交期</td>
+              <td colspan="2">
+                {{pdfData.contractProductBomList[3+(row-1)*3].deliveryTime}}
+              </td>
+            </template>
+          </tr>
+        </template>
+
+        <tr>
+          <td>瓶颈工序说明:</td>
+          <td colspan="6" class="td-left">
+            {{pdfData.bottleneckProcessRemark}}
+          </td>
+        </tr>
+        <tr>
+          <td rowspan="2">检验标准<br>(返单不评审)</td>
+          <td>检验标准</td>
+          <td colspan="3">
+            <div class="checkBoxDiv">
+              <CheckBox :isCheck="pdfData.inspectStandard==10" label="客户标准" />
+              <CheckBox :isCheck="pdfData.inspectStandard==20" label="行业标准" />
+              <CheckBox :isCheck="pdfData.inspectStandard==30" label="公司标准" />
+            </div>
+          </td>
+          <td rowspan="2">现有检验设备</td>
+          <td rowspan="2" colspan="2">
+            <div class="checkBoxDiv">
+              <CheckBox :isCheck="pdfData.inspectDevice==10" label="满足要求" />
+              <CheckBox :isCheck="pdfData.inspectDevice==20" label="不满足要求" />
+            </div>
+          </td>
+        </tr>
+        <tr>
+          <td>
+            抽样比标准
+          </td>
+          <td colspan="3">
+            <div class="checkBoxDiv">
+              <CheckBox :isCheck="pdfData.samplingStandard==10" label="依照客户要求" />
+              <CheckBox :isCheck="pdfData.samplingStandard==20" label="依照公司标准" />
+            </div>
+          </td>
+        </tr>
+        <tr>
+          <td> 注意事项</td>
+          <td colspan="7" class="td-left">
+            {{pdfData.productionRemark}}
+            <div style="text-align:right;padding-right:100px">
+              生产签字:
+            </div>
+          </td>
+        </tr>
+        <!-- 供应链管理部 -->
+        <tr>
+          <td rowspan="3">供应链管理部</td>
+          <td rowspan="3">订单裁决</td>
+          <td>上述结论</td>
+          <td colspan="3">
+            <div class="checkBoxDiv">
+              <CheckBox :isCheck="pdfData.reviewResult==10" label="同意" />
+              <CheckBox :isCheck="pdfData.reviewResult==20" label="不同意" />
+            </div>
+          </td>
+          <td>最终确认客户交期:</td>
+          <td colspan="2">
+            {{pdfData.finalDeliveryTime}}
+          </td>
+        </tr>
+        <tr>
+          <td>需要外部支持</td>
+          <td colspan="6">
+            <div class="checkBoxDiv">
+              <CheckBox :isCheck="pdfData.externalSupport==10" label="外协" />
+              <CheckBox :isCheck="pdfData.externalSupport==20" label="外购" />
+            </div>
+          </td>
+        </tr>
+        <tr>
+          <td>其他意见</td>
+          <td colspan="6" class="td-left">
+            {{pdfData.supplyRemark}}
+            <div style="text-align:right;padding-right:100px">
+              供应链管理部签字:
+            </div>
+          </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>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import $ from "jquery";
+import CheckBox from "./checkBox.vue";
+const { proxy } = getCurrentInstance();
+const pdfData = ref({});
+const props = defineProps({
+  contractProductId: String,
+});
+
+const loading = ref(false);
+const getPdfData = (query) => {
+  loading.value = true;
+  proxy.post("/contractProduct/reviewDetail", query).then((res) => {
+    pdfData.value = res;
+    pdfData.value.rowSpan = Math.ceil(
+      pdfData.value.contractProductBomList.length / 3
+    );
+    pdfData.value.contractProductBomList.unshift({});
+    loading.value = false;
+  });
+};
+
+watch(
+  () => props.contractProductId,
+  (val) => {
+    if (props.contractProductId) {
+      getPdfData({ id: props.contractProductId });
+    }
+  },
+  {
+    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.code} 退货单`,
+      filename: `${pdfData.value.code} 退货单`,
+      exclude_img: false,
+      exclude_links: false,
+      exclude_inputs: true,
+    });
+    // isShowImg.value = true;
+    loading.value = false;
+  }, 500);
+};
+</script>
+
+
+<style lang="scss" scoped>
+.title {
+  font-size: 28px;
+  // font-weight: 700;
+  text-align: center;
+}
+.title-info {
+  font-size: 22px;
+  text-align: center;
+  // font-weight: 700;
+  margin: 15px 0 10px 0;
+}
+
+.table {
+  border-collapse: collapse;
+  border-spacing: 0;
+
+  td {
+    text-align: center;
+    padding: 2px 4px;
+    // padding: 5px 10px;
+  }
+  .td-left {
+    text-align: left;
+  }
+}
+
+.checkBoxDiv {
+  display: flex;
+  align-items: center;
+  justify-content: space-around;
+  // padding-right: 15px;
+  margin-left: -18px;
+}
+</style>

+ 48 - 0
src/components/PDF/checkBox.vue

@@ -0,0 +1,48 @@
+<template>
+  <div class="box">
+    <div class="block">
+      <div class="tick" v-if="isCheck">
+        ✓
+      </div>
+    </div>
+    <div class="label">
+      {{label}}
+    </div>
+  </div>
+
+</template>
+
+<script setup>
+defineProps({
+  isCheck: Boolean,
+  label: String,
+});
+</script>
+
+<style lang="scss" scoped>
+.box {
+  // flex: 1;
+  position: relative;
+  height: 22px;
+  .block {
+    width: 14px;
+    height: 14px;
+    border: 1px solid #dcdfe6;
+    border-radius: 2px;
+    position: relative;
+    top: 5px;
+    .tick {
+      position: absolute;
+      top: -13px;
+      left: 0px;
+      font-size: 22px;
+      color: rgb(46, 45, 45);
+    }
+  }
+  .label {
+    position: relative;
+    left: 18px;
+    top: -10px;
+  }
+}
+</style>

+ 1 - 1
src/components/byForm/index.vue

@@ -19,7 +19,7 @@
           <el-input v-if="i.type == 'input'" v-model="formData[i.prop]" :placeholder="i.placeholder || $t('common.pleaseEnter')"
                     @input="(e) => commonsEmit(e, i)" @change="(e) => commonsEmitChange(e, i)" :type="i.itemType ? i.itemType : 'text'"
                     :disabled="i.disabled ? i.disabled : false" :max="i.max" :min="i.min" :maxlength="i.maxlength"
-                    :readonly="i.readonly ? i.readonly : false" :style="i.style" />
+                    :readonly="i.readonly ? i.readonly : false" :style="i.style" :rows="i.rows||2" />
           <el-input v-if="i.type == 'selectInput'" v-model="formData[i.prop]" :placeholder="i.placeholder || $t('common.pleaseEnter')"
                     @input="(e) => commonsEmit(e, i)" :type="i.itemType ? i.itemType : 'text'" :disabled="i.disabled ? i.disabled : false"
                     :max="i.max" :min="i.min" :maxlength="i.maxlength" :readonly="i.readonly ? i.readonly : false">

+ 39 - 3
src/components/contractCom/contractDetails.vue

@@ -6,7 +6,7 @@
       <!-- <el-tab-pane label="采购订单" name="second"></el-tab-pane> -->
       <el-tab-pane label="生产进度" name="third"></el-tab-pane>
       <el-tab-pane label="待采购" name="four"></el-tab-pane>
-
+      <el-tab-pane label="评审表" name="five"></el-tab-pane>
       <!-- <el-tab-pane label="交易明细" name="third"></el-tab-pane>
       <el-tab-pane label="外销跟单" name="four"> </el-tab-pane>
       <el-tab-pane label="预算表" name="five" v-if="isShowSalesFinancemanArrange">
@@ -208,12 +208,24 @@
         </template>
       </byTable>
     </div>
+    <div v-if="activeName === 'five'">
+      <div style="width:100%">
+        <el-tabs v-model="sonActiveName" type="card" class="demo-tabs" @tab-change="handleSonChange">
+          <el-tab-pane v-for="(item,index) in contractProductList" :key="item.id" :label="item.productName+'('+`${item.productCode}`+')'"
+                       :name="item.id">
+          </el-tab-pane>
+        </el-tabs>
+        <div style="height:calc(100vh - 250px);overflow:auto;text-align:center">
+          <ReviewFormPDF :contractProductId="contractProductId"></ReviewFormPDF>
+        </div>
+      </div>
+    </div>
     <!-- <div v-if="activeName === 'four'">
       <ExportTracking> </ExportTracking>
     </div> -->
-    <div v-if="activeName === 'five'">
+    <!-- <div v-if="activeName === 'five'">
       <ProfitBudgetEHSD> </ProfitBudgetEHSD>
-    </div>
+    </div> -->
     <div v-if="activeName === 'six'">
       <ProfitSettlementEHSD> </ProfitSettlementEHSD>
     </div>
@@ -241,6 +253,8 @@ import ExportTracking from "@/components/detailCom/exportTracking/index.vue";
 import ProfitBudgetEHSD from "@/components/detailCom/profitBudgetEHSD/index.vue";
 import ProfitSettlementEHSD from "@/components/detailCom/profitSettlementEHSD/index.vue";
 import Document from "@/components/detailCom/document/index.vue";
+import ReviewFormPDF from "@/components/PDF/ReviewFormPDF.vue";
+
 import byTable from "@/components/byTable/index";
 import useUserStore from "@/store/modules/user";
 const userInfo = useUserStore();
@@ -799,6 +813,13 @@ const statusData = ref([
 // };
 let first = true;
 let firstOne = true;
+let firstTwo = true;
+const contractProductList = ref([]);
+const sonActiveName = ref("");
+const contractProductId = ref("");
+const handleSonChange = (val) => {
+  contractProductId.value = val;
+};
 const handleChange = (val) => {
   if (["first", "second"].includes(val)) {
     if (val === "first") {
@@ -940,6 +961,21 @@ const handleChange = (val) => {
         }
       });
   }
+
+  if (val == "five" && firstTwo) {
+    firstTwo = false;
+    proxy
+      .post("/contract/detail", {
+        id: props.contractId || route.query.currentContractId,
+      })
+      .then((res) => {
+        contractProductList.value = res.contractProductList;
+        if (contractProductList.value && contractProductList.value.length > 0) {
+          contractProductId.value = contractProductList.value[0].id;
+          sonActiveName.value = contractProductId.value;
+        }
+      });
+  }
 };
 const getDetailsData = (id) => {
   proxy.post("/contract/getVersionList", { id: id }).then((res) => {

+ 17 - 1
src/components/headerBar/header-bar.vue

@@ -312,6 +312,21 @@
               </div>
               <div>待出库</div>
             </div>
+            <div class="job-item" style="margin-right:5px" @click=" handlePushRouter(8)">
+              <el-badge :value="jobData.waitPurchaseCount" :max="99" style="margin-right:20px;margin-top:10px" v-if="jobData.waitPurchaseCount">
+                <div style="margin-top:-10px">
+                  <el-icon size="20" color="#fff">
+                    <Tickets />
+                  </el-icon>
+                </div>
+              </el-badge>
+              <div v-else>
+                <el-icon size="20" color="#fff">
+                  <Tickets />
+                </el-icon>
+              </div>
+              <div>待采购</div>
+            </div>
             <!-- <div class="job-item" @click=" handlePushRouter(6)" v-if="useUserStore().user.companyId =='100'">
               <el-badge :value="jobData.waitClaimCount" :max="99" style="margin-right:20px;margin-top:10px" v-if="jobData.waitClaimCount">
                 <div style="margin-top:-10px">
@@ -392,7 +407,7 @@
               <div style="color: red;margin-bottom:20px">
                 1.打开手机设置 <br>
                 2.找到电池耗电情况<br>
-                3.找到三梵应用<br>
+                3.找到三梵应用并打开<br>
                 4.点击启动管理,然后开启允许后台活动。
               </div>
               <div>
@@ -832,6 +847,7 @@ const handlePushRouter = (att) => {
     5: "WaitingForDelivery",
     6: "Claim",
     7: "InventoryInquiry",
+    8: "Purchase",
   };
 
   proxy.$router.push({

+ 539 - 0
src/components/process/SF/ReviewForm.vue

@@ -0,0 +1,539 @@
+<template>
+  <div style="width: 100%; padding: 0px 15px 50px 15px;text-align:center">
+    <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="formDom">
+      <template #detail>
+        <div id="pdfDom" ref="pdfDom" style="padding: 0px 20px; text-align: center;font-size:12px;color:#000;width:100%">
+          <div class="title">
+            福建三梵体育用品实业有限公司
+          </div>
+          <div class="title-info">
+            评审表
+          </div>
+          <div style="margin-bottom:10px;text-align:left">
+            订单状况:
+            <!-- <el-form-item prop="contractPlaceOrderType" label-width="0px" class="margin-b-0"> -->
+            <el-radio-group v-model="formData.data.contractPlaceOrderType" size="small">
+              <el-radio label="10">
+                首次订单
+                (样品确认:
+                <el-radio-group v-model="formData.data.isSampleRecognize" size="small">
+                  <el-radio :label="1">是</el-radio>
+                  <el-radio :label="0">否</el-radio>
+                </el-radio-group>)
+              </el-radio>
+              <el-radio label="20">
+                客户返单
+                (工程变更:
+                <el-radio-group v-model="formData.data.isProjectChang" size="small">
+                  <el-radio :label="1">是</el-radio>
+                  <el-radio :label="0">否</el-radio>
+                </el-radio-group>)
+              </el-radio>
+            </el-radio-group>
+            <!-- </el-form-item> -->
+
+          </div>
+          <table border="1" style="width: 100%" class="table">
+            <tr>
+              <td colspan="2">客户名称</td>
+              <td>{{formData.data.customerName}}</td>
+              <td>下单日期</td>
+              <td>{{formData.data.contractCreateTime}}</td>
+              <td>产品编码</td>
+              <td>{{formData.data.productCode}}</td>
+              <td>颜色</td>
+              <td>{{formData.data.productColor}}</td>
+            </tr>
+            <tr>
+              <td colspan="2">订单号</td>
+              <td>{{formData.data.contractCode}}</td>
+              <td>交货日期</td>
+              <td>{{formData.data.contractDeliveryTime}}</td>
+              <td>产品名称</td>
+              <td>{{formData.data.productName}}</td>
+              <td>材质</td>
+              <td>{{formData.data.productMaterial}}</td>
+            </tr>
+            <tr>
+              <td colspan="2">业务员</td>
+              <td>{{formData.data.salesmanName}}</td>
+              <td>订单数量</td>
+              <td>{{formData.data.quantity}}</td>
+              <td>产品尺寸(cm)</td>
+              <td colspan="3">
+                {{formData.data.productLength}}*{{formData.data.productWidth}}*{{formData.data.productHeight}}
+              </td>
+            </tr>
+            <tr>
+              <td colspan="2">环保要求</td>
+              <td colspan="3">
+                <el-radio-group v-model="formData.data.isEcoFriendly" size="small" :disabled="!isInformationDept">
+                  <el-radio :label="1">环保产品</el-radio>
+                  <el-radio :label="0">非环保产品</el-radio>
+                </el-radio-group>
+              </td>
+              <td>附出货报告</td>
+              <td colspan="3">
+                <el-radio-group v-model="formData.data.isShippingReport" size="small" :disabled="!isInformationDept">
+                  <el-radio :label="1">是</el-radio>
+                  <el-radio :label="0">否</el-radio>
+                </el-radio-group>
+              </td>
+            </tr>
+            <tr>
+              <td colspan="2">运输方式</td>
+              <td colspan="3">
+                <el-radio-group v-model="formData.data.transportMethod" size="small" :disabled="!isInformationDept">
+                  <el-radio label="1">快递</el-radio>
+                  <el-radio label="0">送货</el-radio>
+                </el-radio-group>
+              </td>
+              <td>品质要求</td>
+              <td colspan="3">
+                <el-radio-group v-model="formData.data.contractQualityLv" size="small" :disabled="!isInformationDept">
+                  <el-radio label="1">电商</el-radio>
+                  <el-radio label="0">品牌</el-radio>
+                </el-radio-group>
+              </td>
+            </tr>
+            <!-- 信息组 -->
+            <tr>
+              <td rowspan="3" style="width:4%">信息组</td>
+              <td style="width:12%">BOM表</td>
+              <td style="width:12%">
+                <el-radio-group v-model="formData.data.isBomTable" size="small" :disabled="!isInformationDept">
+                  <el-radio :label="1">有</el-radio>
+                  <el-radio :label="0">否</el-radio>
+                </el-radio-group>
+              </td>
+              <td style="width:12%">确认样品</td>
+              <td style="width:12%">
+                <el-radio-group v-model="formData.data.isSampleConfirm" size="small" :disabled="!isInformationDept">
+                  <el-radio :label="1">有</el-radio>
+                  <el-radio :label="0">否</el-radio>
+                </el-radio-group>
+              </td>
+              <td style="width:12%">工艺流程图</td>
+              <td style="width:12%">
+                <el-radio-group v-model="formData.data.isTechnologyProcess" size="small" :disabled="!isInformationDept">
+                  <el-radio :label="1">是</el-radio>
+                  <el-radio :label="0">否</el-radio>
+                </el-radio-group>
+              </td>
+              <td style="width:12%">刀模完成</td>
+              <td style="width:12%">
+                <el-radio-group v-model="formData.data.isKnifeMold" size="small" :disabled="!isInformationDept">
+                  <el-radio :label="1">有</el-radio>
+                  <el-radio :label="0">否</el-radio>
+                </el-radio-group>
+              </td>
+            </tr>
+            <tr>
+              <td>图纸完成</td>
+              <td>
+                <el-radio-group v-model="formData.data.isDrawing" size="small" :disabled="!isInformationDept">
+                  <el-radio :label="1">有</el-radio>
+                  <el-radio :label="0">否</el-radio>
+                </el-radio-group>
+              </td>
+              <td>颜色样品</td>
+              <td>
+                <el-radio-group v-model="formData.data.isColorSample" size="small" :disabled="!isInformationDept">
+                  <el-radio :label="1">有</el-radio>
+                  <el-radio :label="0">否</el-radio>
+                </el-radio-group>
+              </td>
+              <td>包装要求</td>
+              <td>
+                <el-radio-group v-model="formData.data.isPackInfo" size="small" :disabled="!isInformationDept">
+                  <el-radio :label="1">有</el-radio>
+                  <el-radio :label="0">否</el-radio>
+                </el-radio-group>
+              </td>
+              <td></td>
+              <td></td>
+            </tr>
+            <tr>
+              <td>特殊要求</td>
+              <td colspan="7">
+                <el-input v-model="formData.data.specialRemark" type="textarea" placeholder=" " :disabled="!isInformationDept"></el-input>
+                <div style="text-align:right;padding-right:100px">
+                  工程签字:
+                </div>
+              </td>
+            </tr>
+            <!-- 采购组 -->
+            <tr>
+              <td rowspan="3">采购部</td>
+              <td>主材交期</td>
+              <td colspan="3">
+                <el-form-item prop="mainMaterialTime" label-width="0px" class="margin-b-0">
+                  <el-date-picker v-model="formData.data.mainMaterialTime" type="date" placeholder=" " value-format="YYYY-MM-DD" style="width:100%"
+                                  :disabled="!isProcurementDept" />
+                </el-form-item>
+              </td>
+              <td>包材交期</td>
+              <td colspan="3">
+                <el-date-picker v-model="formData.data.packMaterialTime" type="date" placeholder=" " value-format="YYYY-MM-DD" style="width:100%"
+                                :disabled="!isProcurementDept" />
+              </td>
+            </tr>
+            <tr>
+              <td>辅材交期</td>
+              <td colspan="3">
+                <el-date-picker v-model="formData.data.auxMaterialTime" type="date" placeholder=" " value-format="YYYY-MM-DD" style="width:100%"
+                                :disabled="!isProcurementDept" />
+              </td>
+              <td>其他交期</td>
+              <td colspan="3">
+                <el-date-picker v-model="formData.data.otherMaterialTime" type="date" placeholder=" " value-format="YYYY-MM-DD" style="width:100%"
+                                :disabled="!isProcurementDept" />
+              </td>
+            </tr>
+            <tr>
+              <td>注意事项</td>
+              <td colspan="7">
+                <el-input v-model="formData.data.purchaseRemark" type="textarea" placeholder=" " :disabled="!isProcurementDept"></el-input>
+                <div style="text-align:right;padding-right:100px">
+                  采购签字:
+                </div>
+              </td>
+            </tr>
+            <!-- 生产组 -->
+            <tr>
+              <td :rowspan="7+formData.data.rowSpan">生产部</td>
+              <td rowspan="3">生产资源评估</td>
+              <td>人员评估</td>
+              <td colspan="6">
+                <el-radio-group v-model="formData.data.personnelEval" size="small" :disabled="!isProductionDept">
+                  <el-radio label="10">现有人员能满足</el-radio>
+                  <el-radio label="20">现有人员不能满足,需调整加班时间或建议招聘临时工</el-radio>
+                </el-radio-group>
+              </td>
+            </tr>
+            <tr>
+              <td>设备评估</td>
+              <td colspan="6">
+                <el-radio-group v-model="formData.data.deviceEval" size="small" :disabled="!isProductionDept">
+                  <el-radio label="10">现有设备能满足</el-radio>
+                  <el-radio label="20">现有设备不能满足,需新增设各或建议委外</el-radio>
+                </el-radio-group>
+              </td>
+            </tr>
+            <tr>
+              <td>工艺评估</td>
+              <td colspan="6">
+                <el-radio-group v-model="formData.data.technologyEval" size="small" :disabled="!isProductionDept">
+                  <el-radio label="20">现有工艺不能满足 </el-radio>
+                  <el-radio label="10">现有工艺能满足,需沟通修改工艺流程</el-radio>
+                </el-radio-group>
+              </td>
+            </tr>
+
+            <template v-if="formData.data.contractProductBomList && formData.data.contractProductBomList.length>0">
+              <tr v-for="(row,index) in  formData.data.rowSpan">
+                <td :rowspan="formData.data.rowSpan+1" v-if="index==0">工序交期</td>
+                <template v-if="index==0">
+                  <td>{{formData.data.contractProductBomList[row].productName}}交期</td>
+                  <td>
+                    <el-date-picker v-model="formData.data.contractProductBomList[row].deliveryTime" type="date" placeholder=" "
+                                    value-format="YYYY-MM-DD" style="width:100%" :disabled="!isProductionDept" />
+                  </td>
+                  <td>{{formData.data.contractProductBomList[row+1].productName}}交期</td>
+                  <td>
+                    <el-date-picker v-model="formData.data.contractProductBomList[row+1].deliveryTime" type="date" placeholder=" "
+                                    value-format="YYYY-MM-DD" style="width:100%" :disabled="!isProductionDept" />
+                  </td>
+                  <td>{{formData.data.contractProductBomList[row+2].productName}}交期</td>
+                  <td colspan="2">
+                    <el-date-picker v-model="formData.data.contractProductBomList[row+2].deliveryTime" type="date" placeholder=" "
+                                    value-format="YYYY-MM-DD" style="width:100%" :disabled="!isProductionDept" />
+                  </td>
+                </template>
+                <template v-else>
+                  <td>{{formData.data.contractProductBomList[1+(row-1)*3].productName}}交期</td>
+                  <td>
+                    <el-date-picker v-model="formData.data.contractProductBomList[1+(row-1)*3].deliveryTime" type="date" placeholder=" "
+                                    value-format="YYYY-MM-DD" style="width:100%" :disabled="!isProductionDept" />
+                  </td>
+                  <td>{{formData.data.contractProductBomList[2+(row-1)*3].productName}}交期</td>
+                  <td>
+                    <el-date-picker v-model="formData.data.contractProductBomList[2+(row-1)*3].deliveryTime" type="date" placeholder=" "
+                                    value-format="YYYY-MM-DD" style="width:100%" :disabled="!isProductionDept" />
+                  </td>
+                  <td>{{formData.data.contractProductBomList[3+(row-1)*3].productName}}交期</td>
+                  <td colspan="2">
+                    <el-date-picker v-model="formData.data.contractProductBomList[3+(row-1)*3].deliveryTime" type="date" placeholder=" "
+                                    value-format="YYYY-MM-DD" style="width:100%" :disabled="!isProductionDept" />
+                  </td>
+                </template>
+              </tr>
+            </template>
+
+            <!-- <tr>
+          <td rowspan="4">工序交期</td>
+          <td>压花交期</td>
+          <td>1</td>
+          <td>丝印交期</td>
+          <td>1</td>
+          <td>冲切交期</td>
+          <td colspan="2">1</td>
+        </tr>
+        <tr>
+          <td>水波交期</td>
+          <td>1</td>
+          <td>激光交期</td>
+          <td>1</td>
+          <td>检验交期</td>
+          <td colspan="2">1</td>
+        </tr>
+        <tr>
+          <td>热压交期</td>
+          <td>1</td>
+          <td>包装交期</td>
+          <td>1</td>
+          <td></td>
+          <td colspan="2"></td>
+        </tr> -->
+            <tr>
+              <td>瓶颈工序说明:</td>
+              <td colspan="6">
+                <el-input v-model="formData.data.bottleneckProcessRemark" type="textarea" placeholder=" " :disabled="!isProductionDept"></el-input>
+              </td>
+            </tr>
+            <tr>
+              <td rowspan="2">检验标准<br>(返单不评审)</td>
+              <td>检验标准</td>
+              <td colspan="3">
+                <el-radio-group v-model="formData.data.inspectStandard" size="small" :disabled="!isProductionDept">
+                  <el-radio label="10">客户标准 </el-radio>
+                  <el-radio label="20">行业标准 </el-radio>
+                  <el-radio label="30">公司标准 </el-radio>
+                </el-radio-group>
+              </td>
+              <td rowspan="2">现有检验设备</td>
+              <td rowspan="2" colspan="2">
+                <el-radio-group v-model="formData.data.inspectDevice" size="small" :disabled="!isProductionDept">
+                  <el-radio label="10">满足要求 </el-radio>
+                  <el-radio label="20">不满足要求 </el-radio>
+                </el-radio-group>
+              </td>
+            </tr>
+            <tr>
+              <td>
+                抽样比标准
+              </td>
+              <td colspan="3">
+                <el-radio-group v-model="formData.data.samplingStandard" size="small" :disabled="!isProductionDept">
+                  <el-radio label="10">依照客户要求 </el-radio>
+                  <el-radio label="20">依照公司标准 </el-radio>
+                </el-radio-group>
+              </td>
+            </tr>
+            <tr>
+              <td> 注意事项</td>
+              <td colspan="7">
+                <el-input v-model="formData.data.productionRemark" type="textarea" placeholder=" " :disabled="!isProductionDept"></el-input>
+                <div style="text-align:right;padding-right:100px">
+                  生产签字:
+                </div>
+              </td>
+            </tr>
+            <!-- 供应链管理部 -->
+            <tr>
+              <td rowspan="3">供应链管理部</td>
+              <td rowspan="3">订单裁决</td>
+              <td>上述结论</td>
+              <td colspan="3">
+                <el-radio-group v-model="formData.data.reviewResult" size="small" :disabled="!isProductionDept">
+                  <el-radio label="10">同意 </el-radio>
+                  <el-radio label="20">不同意 </el-radio>
+                </el-radio-group>
+              </td>
+              <td>最终确认客户交期:</td>
+              <td colspan="2">
+                <el-date-picker v-model="formData.data.finalDeliveryTime" type="date" placeholder=" " value-format="YYYY-MM-DD" style="width:100%"
+                                :disabled="!isProductionDept" />
+              </td>
+            </tr>
+            <tr>
+              <td>需要外部支持</td>
+              <td colspan="6">
+                <el-radio-group v-model="formData.data.externalSupport" size="small" :disabled="!isProductionDept">
+                  <el-radio label="10">外协 </el-radio>
+                  <el-radio label="20">外购 </el-radio>
+                </el-radio-group>
+              </td>
+            </tr>
+            <tr>
+              <td>其他意见</td>
+              <td colspan="6">
+                <el-input v-model="formData.data.supplyRemark" type="textarea" placeholder=" " :disabled="!isProductionDept"></el-input>
+                <div style="text-align:right;padding-right:100px">
+                  供应链管理部签字:
+                </div>
+              </td>
+            </tr>
+          </table>
+        </div>
+      </template>
+
+    </byForm>
+
+  </div>
+</template>
+
+<script setup>
+import byForm from "@/components/byForm/index";
+import { watch } from "vue";
+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: [],
+    aa: "1",
+    bb: "1",
+    cc: "1",
+  },
+});
+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: "slot",
+      slotName: "detail",
+      label: "",
+    },
+  ];
+});
+
+const rules = ref({
+  contractPlaceOrderType: [
+    { required: true, message: "请选择订单状况", trigger: ["change", "blur"] },
+  ],
+  mainMaterialTime: [
+    { required: true, message: "请选择主材交期", trigger: ["change", "blur"] },
+  ],
+});
+const isFormDetail = ref(false);
+if (route.query && route.query.processType && route.query.processType == 20) {
+  isFormDetail.value = true;
+}
+
+const handleSubmit = async (isStag = false) => {
+  // formData.data.contractProductBomList.shift();
+  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("/contractProduct/reviewDetail", { id: businessId })
+      .then((res) => {
+        formData.data = res;
+        formData.data.rowSpan = Math.ceil(
+          formData.data.contractProductBomList.length / 3
+        );
+        formData.data.contractProductBomList.unshift({});
+      });
+  }
+};
+const isInformationDept = ref(false);
+const isProcurementDept = ref(false);
+const isProductionDept = ref(false);
+
+onMounted(() => {
+  // formOption.disabled = judgeStatus();
+  if (route.query.businessId) {
+    getAllData(route.query.businessId);
+  }
+});
+
+watch(props.queryData, () => {
+  if (props.queryData.recordList && props.queryData.recordList.length > 0) {
+    let node = props.queryData.recordList.find(
+      (item) => item.status === 2 && item.nodeType !== 1
+    );
+    if (node) {
+      isInformationDept.value = node.nodeName.includes("信息");
+      isProcurementDept.value = node.nodeName.includes("采购");
+      isProductionDept.value = node.nodeName.includes("生产");
+    }
+  }
+});
+</script>
+
+<style lang="scss" scoped>
+.title {
+  font-size: 28px;
+  // font-weight: 700;
+  text-align: center;
+}
+.title-info {
+  font-size: 22px;
+  text-align: center;
+  // font-weight: 700;
+  margin: 15px 0 10px 0;
+}
+
+.table {
+  border-collapse: collapse;
+  border-spacing: 0;
+
+  td {
+    text-align: center;
+    padding: 2px 4px;
+    // padding: 5px 10px;
+  }
+}
+</style>

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

@@ -945,6 +945,13 @@ const formConfig = computed(() => {
     },
     {
       type: "input",
+      prop: "material",
+      label: "材质",
+      itemWidth: 50,
+      disabled: false,
+    },
+    {
+      type: "input",
       prop: "hsCode",
       label: "海关编码",
       itemWidth: 50,

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

@@ -774,6 +774,13 @@ const formConfig = computed(() => {
     },
     {
       type: "input",
+      prop: "material",
+      label: "材质",
+      itemWidth: 50,
+      disabled: false,
+    },
+    {
+      type: "input",
       prop: "hsCode",
       label: "海关编码",
       itemWidth: 50,

+ 111 - 1
src/views/EHSD/saleContract/contractEHSD/index.vue

@@ -55,6 +55,13 @@
           </div>
         </template>
 
+        <template #reviewStatus="{ item }">
+          <div style="width: 100%">
+            <span>{{ dictValueLabel(item.reviewStatus, reviewStatusData) }}</span>
+            <span :class="item.reviewStatus==10?'red':''" style="margin-left:5px">耗时{{item.reviewElapsedTime}}小时</span>
+          </div>
+        </template>
+
         <template #amount="{ item }">
           <div>
             <span style="padding-right: 4px">{{ item.currency }}</span>
@@ -472,6 +479,16 @@
       </template>
     </el-dialog>
 
+    <el-dialog :title="'下发评审'" v-model="reviewDialog" width="500" destroy-on-close :show-close="false">
+      <el-select v-model="handleUserId" placeholder="请选择办理人" style="width:100%">
+        <el-option v-for="item in selectUserData.userList" :key="item.userId" :label="item.nickName" :value="item.userId" />
+      </el-select>
+      <template #footer>
+        <el-button @click="closeReviewDialog" size="default" v-debounce>取 消</el-button>
+        <el-button @click="handleReview(true)" type="primary" size="default" v-debounce>提 交</el-button>
+      </template>
+    </el-dialog>
+
   </div>
 </template>
 
@@ -588,6 +605,21 @@ const status = ref([
   },
 ]);
 
+const reviewStatusData = ref([
+  {
+    label: "未评审",
+    value: 0,
+  },
+  {
+    label: "评审中",
+    value: 10,
+  },
+  {
+    label: "已评审",
+    value: 30,
+  },
+]);
+
 const contractType = ref([
   {
     dictKey: "3",
@@ -858,6 +890,17 @@ const config = computed(() => {
         return proxy.dictValueLabel(type, status.value);
       },
     },
+    {
+      attrs: {
+        label: "评审状态",
+        slot: "reviewStatus",
+        width: 160,
+      },
+      render(val) {
+        return proxy.dictValueLabel(val, reviewStatusData.value);
+      },
+    },
+
     // {
     //   attrs: {
     //     label: "生产状态",
@@ -1121,7 +1164,7 @@ const config = computed(() => {
           row.processingMethod == 20
             ? {
                 attrs: {
-                  label: "生产",
+                  label: "下发生产",
                   type: "primary",
                   text: true,
                 },
@@ -1185,6 +1228,34 @@ const config = computed(() => {
                 },
               }
             : {},
+          row.reviewStatus == 0
+            ? {
+                attrs: {
+                  label: "下发评审",
+                  type: "primary",
+                  text: true,
+                },
+                el: "button",
+                click() {
+                  // trunContract(row);
+                  // let flowKey = "contract_review_flow";
+                  // proxy.$router.replace({
+                  //   path: "/platform_manage/process/processApproval",
+                  //   query: {
+                  //     flowKey: flowKey,
+                  //     flowName: "下发评审表流程",
+                  //     random: proxy.random(),
+                  //   },
+                  // });
+                  proxy
+                    .msgConfirm()
+                    .then((res) => {
+                      handleReview(false, row);
+                    })
+                    .catch((err) => {});
+                },
+              }
+            : {},
           // && row.outboundStatus == 0 && row.produceStatus == 2
           row.status == 30 && row.produceStatus >= 0
             ? {
@@ -2577,6 +2648,45 @@ const submitConfirm = (type) => {
     });
   });
 };
+
+const reviewDialog = ref(false);
+const selectUserData = ref({});
+const handleUserId = ref("");
+const reviewRowData = ref({});
+const handleReview = (flag = false, row = {}) => {
+  if (row.id) {
+    reviewRowData.value = row;
+  }
+  let nodeId = selectUserData.value.nodeId || "";
+  if (flag && !handleUserId.value) {
+    return proxy.msgTip("请选择办理人", 2);
+  }
+  proxy
+    .post("/contract/createReview", {
+      id: reviewRowData.value.id,
+      selectUserList: [
+        {
+          nodeId,
+          handleUserId: handleUserId.value,
+        },
+      ],
+    })
+    .then((res) => {
+      if (res && res.success != undefined && res.success == false) {
+        selectUserData.value = res.selectUserList[0];
+        reviewDialog.value = true;
+      } else {
+        proxy.msgTip("操作成功", 1);
+        reviewDialog.value = false;
+      }
+    });
+};
+
+const closeReviewDialog = () => {
+  reviewDialog.value = false;
+  selectUserData.value = {};
+  handleUserId.value = "";
+};
 </script>
 
 <style lang="scss" scoped>

+ 8 - 1
src/views/MES/productionOrder/index.vue

@@ -749,7 +749,14 @@ const config = computed(() => {
                 },
                 el: "button",
                 click() {
-                  confirmDeliveryTime(row);
+                  proxy
+                    .post("/produceOrder/notTechnologyCheck", { id: row.id })
+                    .then(
+                      (res) => {
+                        confirmDeliveryTime(row);
+                      },
+                      (err) => {}
+                    );
                 },
               }
             : {},

+ 346 - 34
src/views/MES/productionTask/index.vue

@@ -1,15 +1,20 @@
 <template>
   <div class="pageIndexClass">
     <byTable :hideTable="true" :hidePagination="true" :config="[]" highlight-current-row :selectConfig="selectConfig"
-             :pagination="sourceList.pagination" :action-list="[ {
-                text: '排程',
-                action: () => addScheduling('add'),
-                disabled: ['1','2','3','4'].includes(pageActiveName),
-              } ,{
-                text: '打印',
-                action: () => openModal('add'),
-                disabled: selectIds.length==0,
-              }]" :isCustomResetFn="true" @get-list="handleSearch" @search-reset="searchReset">
+             :pagination="sourceList.pagination" :action-list="[ 
+             {
+                text: isShowSeveral?'全部工序':'部分工序', 
+                action: ()=> isShowSeveral = !isShowSeveral,
+             },
+      {
+      text: '排程',
+      action: () => addScheduling('add'),
+      disabled: ['1','2','3','4'].includes(pageActiveName),
+      } ,{
+      text: '打印',
+      action: () => openModal('add'),
+      disabled: selectIds.length==0,
+      }]" :isCustomResetFn="true" @get-list="handleSearch" @search-reset="searchReset">
     </byTable>
 
     <div style="background:#fff">
@@ -31,14 +36,14 @@
           </template>
 
         </el-tab-pane>
-        <el-tab-pane label="所有任务" name="3">
+        <!-- <el-tab-pane label="所有任务" name="3">
           <template #label>
             <div style="display:flex;align-items:center">
               <div>所有任务</div>
               <div class="badge" v-if="Number(taskCountObj['allCount'])">{{taskCountObj['allCount'] || 0}}</div>
             </div>
           </template>
-        </el-tab-pane>
+        </el-tab-pane> -->
         <el-tab-pane label="车间工序结存" name="4">
           <template #label>
             <div style="display:flex;align-items:center">
@@ -48,18 +53,37 @@
           </template>
 
         </el-tab-pane>
-        <el-tab-pane v-for="item in processesData" :label="item.name" :name="item.id" :key="item.id">
-          <template #label>
-            <div style="display:flex;align-items:center">
-              <!-- <el-badge :value="Number(taskCountObj[item.id])||0" :max="99">
+
+        <template v-for="(item,index) in processesData" :key="item.id" v-if="isShowSeveral">
+          <el-tab-pane :label="item.name" :name="item.id" v-if="item.isShow==1">
+            <template #label>
+              <div style="display:flex;align-items:center">
+                <!-- <el-badge :value="Number(taskCountObj[item.id])||0" :max="99">
                 {{item.name}}
               </el-badge> -->
-              <div>
-                {{item.name}} </div>
-              <div class="badge" v-if="Number(taskCountObj[item.id])>0">{{Number(taskCountObj[item.id])||0}}</div>
-            </div>
-          </template>
-        </el-tab-pane>
+                <div>
+                  {{item.name}} </div>
+                <div class="badge" v-if="Number(taskCountObj[item.id])>0">{{Number(taskCountObj[item.id])||0}}</div>
+              </div>
+            </template>
+          </el-tab-pane>
+        </template>
+
+        <template v-for="(item,index) in processesData" :key="item.id" v-if="!isShowSeveral">
+          <el-tab-pane :label="item.name" :name="item.id">
+            <template #label>
+              <div style="display:flex;align-items:center">
+                <!-- <el-badge :value="Number(taskCountObj[item.id])||0" :max="99">
+                {{item.name}}
+              </el-badge> -->
+                <div>
+                  {{item.name}} </div>
+                <div class="badge" v-if="Number(taskCountObj[item.id])>0">{{Number(taskCountObj[item.id])||0}}</div>
+              </div>
+            </template>
+          </el-tab-pane>
+        </template>
+
       </el-tabs>
     </div>
     <div v-if="['1','2','3','4'].includes(pageActiveName)">
@@ -73,6 +97,7 @@
 
         <template #btn="{ item }">
           <div style="width: 100%">
+            <el-button type="primary" text @click="startConfirm(item)">开工确认</el-button>
             <el-button type="primary" text @click="printQrCode(item)">任务单</el-button>
             <el-popover placement="bottom-start" title="" :width="300" trigger="hover">
               <div style="width:100%">
@@ -271,7 +296,7 @@
           <!-- <div style="font-size:20px;text-align:center">
             {{printData.name}}
           </div> -->
-          <div v-for="item in printList" :key="item.id" style="margin-bottom:20px">
+          <!-- <div v-for="item in printList" :key="item.id" style="margin-bottom:20px">
             <div style="font-size:32px;font-weight:700;color:#000;text-align:center">
               生产任务单
             </div>
@@ -345,10 +370,6 @@
                     <div style="font-weight:700">产品图</div>
                     <img v-if="item.fileList &&item.fileList.length > 0" class="bigImg" :src="item.fileList[0].fileUrl" alt="">
                   </div>
-                  <!-- <div style="margin-top:20px">
-                    <div style="font-weight:700">设计图</div>
-                    <img v-if="item.fileListOne &&item.fileListOne.length > 0" class="bigImg" :src="item.fileListOne[0].fileUrl" alt="">
-                  </div> -->
                 </td>
                 <td style="height:60px;vertical-align:top">
                   <div>
@@ -367,8 +388,6 @@
                     生产工序
                   </div>
                   <div>
-                    <!-- <el-checkbox v-for="proess in item.productionTaskProgressList" :key="proess.processesId" :label="proess.progressName"
-                                 size="small" /> -->
                     <span v-for="(proess,index) in item.productionTaskProgressList" :key="proess.processesId">{{proess.progressName}} <span
                             v-if="index<item.productionTaskProgressList.length-1"> > </span> </span>
                   </div>
@@ -401,7 +420,6 @@
                     <table border class="table son">
                       <tr>
                         <td style="width:85%">名称</td>
-                        <!-- <td style="width:15%">单价</td> -->
                         <td style="width:15%">数量</td>
                       </tr>
                       <tr v-for="son in item.contractProductBomList" :key="son.id">
@@ -413,14 +431,93 @@
                             {{son.productName}}
                           </div>
                         </td>
-                        <!-- <td>{{son.price}}</td> -->
+
                         <td>{{son.quantity}}</td>
                       </tr>
                     </table>
                   </div>
                 </td>
               </tr>
+            </table>
+            <div style="page-break-after: always"></div>
+          </div> -->
 
+          <div v-for="item in printList" :key="item.id" style="margin-bottom:20px">
+            <div style="display:flex;align-items:center;padding:0 20px;margin-bottom:20px">
+              <div :ref="item.id" style="width:100px">
+              </div>
+              <div style="margin-left:20px;flex:1">
+                <div class="companyTitle">
+                  福建三梵体育用品实业有限公司
+                </div>
+                <div class="printTitle">
+                  流程卡
+                </div>
+              </div>
+            </div>
+            <table class="table" border>
+              <tr>
+                <td>订单号</td>
+                <td colspan="2">{{item.orderCode}}</td>
+                <td colspan="2">产品名称</td>
+                <td colspan="2">{{item.productName}}({{item.productCode}})</td>
+              </tr>
+              <tr>
+                <td>尺寸(cm)</td>
+                <td colspan="2">{{item.productLength}} * {{item.productWidth}} * {{item.productHeight}}</td>
+                <td colspan="2">规格颜色</td>
+                <td colspan="2">{{item.productColor}}</td>
+              </tr>
+              <tr>
+                <td style="width:16%">工序</td>
+                <td style="width:14%">日期</td>
+                <td style="width:14%">操作人</td>
+                <td style="width:14%">投入数</td>
+                <td style="width:14%">正品数</td>
+                <td style="width:14%">小瑕疵</td>
+                <td style="width:14%">大瑕疵</td>
+              </tr>
+              <tr v-for="(proess,index) in item.productionTaskProgressList" :key="proess.processesId">
+                <td>{{proess.progressName}}</td>
+                <td></td>
+                <td></td>
+                <td></td>
+                <td></td>
+                <td></td>
+                <td></td>
+              </tr>
+              <tr>
+                <td colspan="7">
+                  其他生产说明:{{item.productRemark}}
+                </td>
+              </tr>
+              <tr>
+                <td>工序</td>
+                <td>日期</td>
+                <td>领料数</td>
+                <td>剩余数</td>
+                <td>用途</td>
+                <td>领料员</td>
+                <td>备注</td>
+              </tr>
+              <tr>
+                <td>出库</td>
+                <td></td>
+                <td></td>
+                <td></td>
+                <td></td>
+                <td></td>
+                <td></td>
+              </tr>
+              <tr>
+                <td>出库</td>
+                <td></td>
+                <td></td>
+                <td></td>
+                <td></td>
+                <td></td>
+                <td></td>
+              </tr>
             </table>
             <div style="page-break-after: always"></div>
           </div>
@@ -696,6 +793,64 @@
         <el-button @click="shortageMaterialDialog = false" size="defualt">关 闭</el-button>
       </template>
     </el-dialog>
+
+    <el-dialog :title="'开工确认'" v-model="confirmDialog" width="80%" destroy-on-close>
+      <div style="display:flex">
+        <div class="left" style="width:50%;">
+          <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>
+
+      <template #footer>
+        <el-button @click="confirmDialog =false" size="default" v-debounce>取 消</el-button>
+      </template>
+    </el-dialog>
+
   </div>
 
 </template>
@@ -708,6 +863,7 @@ import moment from "moment";
 import SelectProductionTask from "@/views/MES/productionTask/selectProductionTask.vue";
 import "@imengyu/vue3-context-menu/lib/vue3-context-menu.css";
 import ContextMenu from "@imengyu/vue3-context-menu";
+import { reactive } from "vue";
 
 const { proxy } = getCurrentInstance();
 const contractTag = computed(
@@ -719,6 +875,7 @@ const backLinesData = computed(
 const frontLinesData = computed(
   () => proxy.useUserStore().allDict["front_lines"]
 );
+const isShowSeveral = ref(true);
 const pageActiveName = ref("1");
 const lastPageActiveName = ref("");
 const handlePageTabChange = (val) => {
@@ -899,7 +1056,7 @@ const config = ref([
   {
     attrs: {
       label: "操作",
-      width: "200",
+      width: "150",
       slot: "btn",
       align: "left",
       // fixed: "right",
@@ -957,6 +1114,14 @@ const config = ref([
   },
   {
     attrs: {
+      label: "生产订单号",
+      prop: "code",
+      width: 150,
+      fixed: "left",
+    },
+  },
+  {
+    attrs: {
       label: "产品名称",
       prop: "productName",
       "min-width": 200,
@@ -1552,8 +1717,8 @@ const openModal = () => {
           proxy.$refs[row.id][0].innerHTML = ""; //清除二维码方法一
           new QRCode(proxy.$refs[row.id][0], {
             text: row.id,
-            width: 200,
-            height: 200,
+            width: 100,
+            height: 100,
             colorDark: "#000000",
             colorLight: "#ffffff",
             correctLevel: QRCode.CorrectLevel.H,
@@ -1659,6 +1824,7 @@ const beforeClose = () => {
   }
   dialogVisible.value = false;
 };
+
 const printObj = ref({
   id: "pdfDom",
   popTitle: "",
@@ -1667,6 +1833,14 @@ const printObj = ref({
   extraHead: '<meta http-equiv="Content-Language"content="zh-cn"/>',
 });
 
+const printObjOne = ref({
+  id: "printDom",
+  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 handleClickFile = (file) => {
   window.open(file.fileUrl, "_blank");
 };
@@ -2201,6 +2375,127 @@ const lookDetail = (row) => {
   shortageMaterialTab.value = "1";
   shortageMaterialDialog.value = true;
 };
+
+const formLoading = ref(false);
+const confirmFormDom = ref(null);
+const confirmDialog = ref(false);
+const confirmFormData = reactive({
+  data: {},
+});
+const confirmFormOption = reactive({
+  inline: true,
+  labelWidth: 100,
+  itemWidth: 100,
+  disabled: false,
+});
+const confirmFormConfig = computed(() => [
+  {
+    type: "date",
+    itemType: "date",
+    label: "预计上线",
+    prop: "expectBeginTime",
+    itemWidth: 100,
+  },
+  {
+    type: "date",
+    itemType: "date",
+    label: "预计交货",
+    prop: "expectDeliveryTime",
+    itemWidth: 100,
+  },
+  {
+    type: "radio",
+    label: "是否同意开工生产",
+    prop: "isAgreeWork",
+    data: [
+      { label: "是", value: 1 },
+      { label: "否", value: 0 },
+    ],
+    itemWidth: 100,
+  },
+  {
+    type: "radio",
+    label: "走柜是否明确",
+    prop: "isCabinetConfirm",
+    data: [
+      { label: "是", value: 1 },
+      { label: "否", value: 0 },
+    ],
+    itemWidth: 100,
+  },
+  {
+    type: "date",
+    itemType: "date",
+    label: "走柜时间",
+    prop: "cabinetExitTime",
+    itemWidth: 100,
+  },
+  {
+    type: "input",
+    itemType: "textarea",
+    label: "其他说明",
+    prop: "workRemark",
+    itemWidth: 100,
+  },
+]);
+const confirmRules = 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 startConfirm = (row) => {
+  confirmDialog.value = true;
+  proxy
+    .post("/produceOrderDetail/beginWorkDetail", {
+      id: row.id,
+    })
+    .then((res) => {
+      confirmFormData.data = res;
+      confirmFormOption.disabled = confirmFormData.data.beginWorkStatus == 1;
+    });
+};
+
+const submitConfirm = (flag) => {
+  if (flag) {
+    confirmFormDom.value.handleSubmit(() => {
+      confirmFormData.data.beginWorkStatus = "1";
+      formLoading.value = true;
+      proxy
+        .post("/produceOrderDetail/editBeginWork", confirmFormData.data)
+        .then((res) => {
+          proxy.msgTip("操作成功");
+          formLoading.value = false;
+          confirmDialog.value = false;
+          getList();
+        });
+    });
+  } else {
+    confirmFormData.data.beginWorkStatus = "0";
+    formLoading.value = true;
+    proxy
+      .post("/produceOrderDetail/editBeginWork", confirmFormData.data)
+      .then((res) => {
+        proxy.msgTip("操作成功");
+        formLoading.value = false;
+        confirmDialog.value = false;
+        getList();
+      });
+  }
+};
 </script>
 
 <style lang="scss" scoped>
@@ -2223,7 +2518,7 @@ const lookDetail = (row) => {
   width: 100%;
   td {
     text-align: left;
-    padding: 10px;
+    padding: 6px;
     font-size: 13px;
     // padding: 5px 10px;
     .top-title {
@@ -2240,6 +2535,15 @@ const lookDetail = (row) => {
     }
   }
 }
+.companyTitle {
+  font-size: 28px;
+  text-align: center;
+}
+.printTitle {
+  font-size: 22px;
+  margin-top: 15px;
+  text-align: center;
+}
 .son {
   td {
     text-align: left;
@@ -2296,5 +2600,13 @@ const lookDetail = (row) => {
   margin-left: 2px;
   margin-top: -2px;
 }
+#printDom {
+  color: #000;
+  .title {
+    font-size: 28px;
+    margin-bottom: 20px;
+    text-align: center;
+  }
+}
 </style>
 

+ 2 - 2
src/views/finance/fundManage/account/index.vue

@@ -177,11 +177,11 @@ const config = computed(() => {
 const corporationList = ref([]);
 const typeData = ref([
   {
-    label: "公",
+    label: "公",
     value: 10,
   },
   {
-    label: "私",
+    label: "私",
     value: 20,
   },
 ]);

+ 2 - 2
src/views/finance/fundManage/costControl/index.vue

@@ -391,11 +391,11 @@ const config = computed(() => {
 const corporationList = ref([]);
 const typeData = ref([
   {
-    label: "公",
+    label: "公",
     value: 1,
   },
   {
-    label: "私",
+    label: "私",
     value: 2,
   },
 ]);

+ 539 - 0
src/views/oa/application/equipmentMaintenance/index.vue

@@ -0,0 +1,539 @@
+<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="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>
+  </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";
+
+const { proxy } = getCurrentInstance();
+const accountCurrency = ref([]);
+const typeData = ref([
+  {
+    label: "收入",
+    value: "10",
+  },
+  {
+    label: "支出",
+    value: "20",
+  },
+]);
+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: "提交人",
+        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",
+        // width: 110,
+      },
+    },
+    {
+      attrs: {
+        label: "配件",
+        prop: "deptName",
+        // width: 110,
+      },
+    },
+    {
+      attrs: {
+        label: "厂家",
+        prop: "deptName",
+        // width: 110,
+      },
+    },
+    {
+      attrs: {
+        label: "维修方案",
+        prop: "deptName",
+        // width: 110,
+      },
+    },
+    // {
+    //   attrs: {
+    //     label: "承包单位",
+    //     prop: "contractorName",
+    //     width: 130,
+    //   },
+    // },
+    // {
+    //   attrs: {
+    //     label: "账期",
+    //     prop: "accountPeriod",
+    //     width: 90,
+    //   },
+    // },
+    // {
+    //   attrs: {
+    //     label: "账期金额",
+    //     prop: "accountPeriodAmount",
+    //     width: 100,
+    //   },
+    //   render(val) {
+    //     return proxy.moneyFormat(val, 2);
+    //   },
+    // },
+    // {
+    //   attrs: {
+    //     label: "预付金额",
+    //     prop: "prepaidAmount",
+    //     width: 100,
+    //   },
+    //   render(val) {
+    //     return proxy.moneyFormat(val, 2);
+    //   },
+    // },
+    {
+      attrs: {
+        label: "成本费用",
+        prop: "finalAmount",
+        width: 100,
+      },
+      render(val) {
+        return proxy.moneyFormat(val, 2);
+      },
+    },
+    // {
+    //   attrs: {
+    //     label: "说明",
+    //     prop: "remark",
+    //     "min-width": 200,
+    //   },
+    // },
+    {
+      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("/epibolyBill/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("/epibolyBill/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: "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_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",
+      itemType: "text",
+      label: "设备型号",
+      itemWidth: 100,
+      disabled: false,
+    },
+    {
+      type: "input",
+      prop: "remark",
+      itemType: "text",
+      label: "配件",
+      itemWidth: 100,
+      disabled: false,
+    },
+    {
+      type: "input",
+      prop: "remark",
+      itemType: "text",
+      label: "厂家",
+      itemWidth: 100,
+      disabled: false,
+    },
+    {
+      type: "input",
+      prop: "remark",
+      itemType: "text",
+      label: "维修方案",
+      itemWidth: 100,
+      disabled: false,
+    },
+    {
+      type: "number",
+      prop: "finalAmount",
+      label: "成本费用",
+      precision: 2,
+      min: 0,
+      controls: false,
+      itemWidth: 50,
+    },
+    {
+      type: "upload",
+      listType: "text",
+      accept: "",
+      prop: "fileList",
+      label: "附件",
+    },
+    // {
+    //   type: "input",
+    //   prop: "remark",
+    //   itemType: "textarea",
+    //   label: "说明",
+    //   itemWidth: 100,
+    //   disabled: false,
+    // },
+    // {
+    //   type: "title1",
+    //   title: "流程异常备注",
+    // },
+    // {
+    //   type: "input",
+    //   prop: "remark",
+    //   itemType: "textarea",
+    //   label: "明细备注",
+    //   itemWidth: 100,
+    //   disabled: false,
+    // },
+  ];
+});
+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" },
+  ],
+  fileList: [{ required: true, message: "请上传账单附件", trigger: "change" }],
+  remark: [{ required: true, message: "请输入说明", trigger: "blur" }],
+});
+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;
+};
+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("/epibolyBill/" + 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";
+  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;
+};
+</script>
+
+<style lang="scss" scoped>
+.tenant {
+  padding: 20px;
+}
+::v-deep(.el-input-number .el-input__inner) {
+  text-align: left;
+}
+</style>

+ 4 - 0
src/views/process/processApproval/index.vue

@@ -79,6 +79,9 @@
         <ManualDelivery ref="makeDom" v-else-if="flowForm.flowKey == 'manual_out_stock_flow'" :queryData="queryData.data">
         </ManualDelivery>
 
+        <ReviewForm ref="makeDom" v-else-if="flowForm.flowKey == 'contract_review_flow'" :queryData="queryData.data">
+        </ReviewForm>
+
         <!-- 取消到账认领 -->
         <!-- <CancelClaim ref="makeDom" v-else-if="flowForm.flowKey == 'claim_del_flow'" :queryData="queryData.data"></CancelClaim> -->
       </div>
@@ -256,6 +259,7 @@ import InvoiceTaxDeduction from "@/components/process/SF/InvoiceTaxDeduction";
 import InvoicingApplication from "@/components/process/SF/InvoicingApplication";
 import ManualWarehousing from "@/components/process/SF/ManualWarehousing";
 import ManualDelivery from "@/components/process/SF/ManualDelivery";
+import ReviewForm from "@/components/process/SF/ReviewForm";
 
 import PurchasePayment from "@/components/process/PurchasePayment";
 import SendFunds from "@/components/process/SendFunds";

+ 13 - 7
src/views/process/processConfig/vueFlow.vue

@@ -307,13 +307,17 @@ const formConfig = computed(() => {
           value: 8,
         },
         {
-          label: "表达式(单处理人)",
+          label: "定制开发-单人处理",
           value: 9,
         },
         {
-          label: "用户组群(多人并行办理机制,需定制开发)",
+          label: "定制开发-多人并行",
           value: 6,
         },
+        {
+          label: "sql表达式",
+          value: 10,
+        },
       ],
     },
     // {
@@ -332,7 +336,7 @@ const formConfig = computed(() => {
       data: selectHanleData.value,
       isShow:
         formData.data.handleObjectType &&
-        ![5, 6, 8, 9].includes(formData.data.handleObjectType),
+        ![5, 6, 8, 9, 10].includes(formData.data.handleObjectType),
     },
     {
       type: "select",
@@ -359,13 +363,15 @@ const formConfig = computed(() => {
     {
       type: "input",
       prop: "jumpCondition",
-      label: "条件表达式",
+      label: "表达式",
       required: true,
-      itemType: "text",
-      itemWidth: 50,
+      itemType: formData.data.handleObjectType === 10 ? "textarea" : "text",
+      itemWidth: 100,
+      rows: 4,
       isShow:
         formData.data.handleObjectType === 9 ||
-        formData.data.handleObjectType === 8,
+        formData.data.handleObjectType === 8 ||
+        formData.data.handleObjectType === 10,
     },
     {
       type: "select",

+ 26 - 0
src/views/production/project/processes/index.vue

@@ -109,6 +109,16 @@ const config = computed(() => {
     },
     {
       attrs: {
+        label: "是否在生产订单页面显示",
+        prop: "isShow",
+      },
+      render(val) {
+        console.log(val, "adww");
+        return val == 1 ? "是" : "否";
+      },
+    },
+    {
+      attrs: {
         label: "生产单价",
         prop: "costPrice",
       },
@@ -222,6 +232,21 @@ const formConfig = computed(() => {
       required: true,
     },
     {
+      type: "select",
+      prop: "isShow",
+      label: "是否在生产订单页面显示",
+      data: [
+        {
+          label: "是",
+          value: "1",
+        },
+        {
+          label: "否",
+          value: "0",
+        },
+      ],
+    },
+    {
       type: "number",
       prop: "costPrice",
       label: "生产单价",
@@ -307,6 +332,7 @@ const submitForm = () => {
 const getDtl = (row) => {
   modalType.value = "edit";
   proxy.post("/productionProcesses/detail", { id: row.id }).then((res) => {
+    res.isShow = res.isShow + "";
     fileList.value = res.fileName
       ? [
           {

+ 858 - 0
src/views/report/summaryAccountsPayable/index.vue

@@ -0,0 +1,858 @@
+<template>
+  <div class="pageIndexClass">
+    <div class="content">
+      <byTable :source="sourceList.data" :pagination="sourceList.pagination" :selectConfig="selectConfig" :config="config" highlight-current-row
+               :action-list="[{
+                text: '导出Excel',
+                action: () => exportExcel(),
+                disabled: false,
+              }
+        ]" @get-list="getList" :hideTable="true" :hidePagination="true">
+        <template #code="{item}">
+          <div style="width:100%">
+            <span class="el-click" @click="getDtl(item)">{{item.code}}</span>
+          </div>
+        </template>
+      </byTable>
+      <div style="padding:0 15px 10px 15px;background:#fff">
+        <el-table :data="sourceList.data" :height="tableHeight" style="width: 100%;margin-top:-10px" v-loading="loading" border
+                  :span-method="objectSpanMethod" :row-class-name="getRowClass" id="my-table">
+          <el-table-column prop="supplierName" label="供应商名称" width="130" fixed="left">
+            <!-- <template #default="{ row, $index }">
+              <div style="width: 100%">
+                <span v-if="$index < sourceList.data.length - 1"> {{row.supplierName}}</span>
+                <div style="text-align:right" v-else>
+                  合计:
+                </div>
+              </div>
+            </template> -->
+          </el-table-column>
+          <el-table-column prop="supplierShortName" label="供应商简称" width="130" fixed="left">
+          </el-table-column>
+          <el-table-column prop="supplierTaxPoints" label="税点" width="60" fixed="left">
+          </el-table-column>
+          <el-table-column prop="warehouseName" label="入库仓库" width="130" fixed="left">
+          </el-table-column>
+
+          <el-table-column prop="yearBeginBalance" label="年初余额" width="80" fixed="left" align="right">
+            <template #default="{ row, $index }">
+              <div style="width: 100%">
+                {{moneyFormat(row.yearBeginBalance,2)}}
+              </div>
+            </template>
+          </el-table-column>
+          <template v-if="monthList && monthList.length>0">
+            <el-table-column v-for="col in monthList" :key="col.key" :label="col.label" align="center">
+              <el-table-column label="贷方发生额" align="center">
+                <el-table-column label="到货金额" width="80" align="right">
+                  <template #default="{ row, $index }">
+                    <div style="width: 100%" v-if="row.monthData[col.key] && row.monthData[col.key].arrivalAmount">
+                      {{moneyFormat(row.monthData[col.key].arrivalAmount,2)}}
+                    </div>
+                  </template>
+                </el-table-column>
+                <el-table-column label="退货金额" width="80" align="right">
+                  <template #default="{ row, $index }">
+                    <div style="width: 100%" v-if="row.monthData[col.key] && row.monthData[col.key].backAmount">
+                      {{moneyFormat(row.monthData[col.key].backAmount,2)}}
+                    </div>
+                  </template>
+                </el-table-column>
+                <el-table-column label="货款调整" width="80" align="right">
+                  <template #default="{ row, $index }">
+                    <div style="width: 100%" v-if="row.monthData[col.key] && row.monthData[col.key].arrivalAdjustAmount">
+                      {{moneyFormat(row.monthData[col.key].arrivalAdjustAmount,2)}}
+                    </div>
+                  </template>
+                </el-table-column>
+                <el-table-column label="税费" width="80" align="right">
+                  <template #default="{ row, $index }">
+                    <div style="width: 100%" v-if="row.monthData[col.key] && row.monthData[col.key].taxAmount">
+                      {{moneyFormat(row.monthData[col.key].taxAmount,2)}}
+                    </div>
+                  </template>
+                </el-table-column>
+                <el-table-column label="税费调整" width="100" align="right">
+                  <template #default="{ row, $index }">
+                    <el-input-number onmousewheel="return false;" v-model="row.monthData[col.key].taxAdjustAmount" placeholder=" " style="width: 100%"
+                                     :precision="2" :controls="false" @change="(val)=>changeData(row,val)" />
+                    <!-- <el-input v-model="row.monthData[col.key].taxAdjustAmount" placeholder=" " @change="(val)=>changeData(row,val)"></el-input> -->
+                  </template>
+                </el-table-column>
+              </el-table-column>
+
+              <el-table-column label="借方发生额" width="80" align="right">
+                <template #default="{ row, $index }">
+                  <div style="width: 100%" v-if="row.monthData[col.key] && row.monthData[col.key].paymentAmount">
+                    {{moneyFormat(row.monthData[col.key].paymentAmount,2)}}
+                  </div>
+                </template>
+              </el-table-column>
+
+              <el-table-column label="期末余额" width="80" align="right">
+                <template #default="{ row, $index }">
+                  <div style="width: 100%">
+                    {{moneyFormat(row.monthData[col.key].endAmount,2)}}
+                  </div>
+                </template>
+              </el-table-column>
+
+            </el-table-column>
+            <el-table-column label="备注" width="130">
+              <template #default="{ row, $index }">
+                <el-input v-model="row.remark" placeholder=" " @change="(val)=>changeData(row,val)"></el-input>
+              </template>
+            </el-table-column>
+          </template>
+        </el-table>
+        <el-row class="table-pagination" justify="end" type="flex" style="margin-top:10px ">
+          <el-pagination background layout="total, sizes, prev, pager, next, jumper" :current-page="sourceList.pagination.pageNum"
+                         :page-size="sourceList.pagination.pageSize" :total="sourceList.pagination.total" @size-change="handleSizeChange"
+                         @current-change="handlePageChange" :page-sizes="[10, 20, 30, 40, 50]" />
+        </el-row>
+      </div>
+
+    </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 moment from "moment";
+import FileSaver from "file-saver";
+import * as XLSX from "xlsx";
+
+const { proxy } = getCurrentInstance();
+const tableHeight = ref(0);
+const getTableHeight = () => {
+  tableHeight.value = window.innerHeight - 150 - 30 - 50;
+};
+getTableHeight();
+window.addEventListener("resize", () => {
+  getTableHeight();
+});
+const sealType = computed(() => proxy.useUserStore().allDict["seal_type"]);
+const userList = ref([]);
+const deptData = ref([]);
+const typeData = ref([
+  {
+    label: "收入",
+    value: "10",
+  },
+  {
+    label: "支出",
+    value: "20",
+  },
+]);
+const monthList = ref([
+  { key: 1, label: "1月" },
+  { key: 2, label: "2月" },
+  { key: 3, label: "3月" },
+  { key: 4, label: "4月" },
+  { key: 5, label: "5月" },
+  { key: 6, label: "6月" },
+  { key: 7, label: "7月" },
+  { key: 8, label: "8月" },
+  { key: 9, label: "9月" },
+  { key: 10, label: "10月" },
+  { key: 11, label: "11月" },
+  { key: 12, label: "12月" },
+]);
+const sourceList = ref({
+  data: [],
+  pagination: {
+    total: 0,
+    pageNum: 1,
+    pageSize: 10,
+    keyword: "",
+    year: moment().format("yyyy"),
+  },
+});
+const loading = ref(false);
+const statusData = ref([
+  {
+    label: "草稿",
+    value: 0,
+  },
+  {
+    label: "审批中",
+    value: 10,
+  },
+  {
+    label: "审批驳回",
+    value: 20,
+  },
+  {
+    label: "审批通过",
+    value: 30,
+  },
+  {
+    label: "作废",
+    value: 88,
+  },
+]);
+const processingMethod = ref([
+  {
+    dictKey: 10,
+    dictValue: "业务自采",
+  },
+  {
+    dictKey: 20,
+    dictValue: "生产处理",
+  },
+]);
+
+const contractType = ref([
+  {
+    dictKey: "3",
+    dictValue: "打样订单",
+  },
+  {
+    dictKey: "2",
+    dictValue: "内销订单",
+  },
+  {
+    dictKey: "1",
+    dictValue: "外贸订单(退税)",
+  },
+  {
+    dictKey: "4",
+    dictValue: "外贸订单(不退税)",
+  },
+]);
+const selectConfig = computed(() => {
+  return [
+    {
+      type: "time",
+      itemType: "year",
+      label: "年份",
+      placeholder: "请选择",
+      prop: "year",
+      placeholderOne: "",
+      propOne: "",
+      clearable: false,
+      fn: () => {
+        getList();
+      },
+    },
+  ];
+});
+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: "contractType",
+        width: 110,
+      },
+      render(val) {
+        return proxy.dictKeyValue(val, contractType.value);
+      },
+    },
+    {
+      attrs: {
+        label: "订单处理方式",
+        prop: "processingMethod",
+        width: 110,
+      },
+      render(val) {
+        return proxy.dictKeyValue(val, processingMethod.value);
+      },
+    },
+    {
+      attrs: {
+        label: "销售金额",
+        prop: "deptName",
+      },
+    },
+    {
+      attrs: {
+        label: "订单出货金额",
+        prop: "educationName",
+      },
+    },
+    {
+      attrs: {
+        label: "出货申请出货金额",
+        prop: "amount",
+      },
+      render(val) {
+        return proxy.moneyFormat(val, 2);
+      },
+    },
+    {
+      attrs: {
+        label: "已收定金",
+        prop: "amount",
+      },
+      render(val) {
+        return proxy.moneyFormat(val, 2);
+      },
+    },
+    {
+      attrs: {
+        label: "是否可结算",
+        prop: "educationName",
+      },
+    },
+    {
+      attrs: {
+        label: "是否已结算",
+        prop: "educationName",
+      },
+    },
+    {
+      attrs: {
+        label: "客户名称",
+        prop: "educationName",
+      },
+    },
+    {
+      attrs: {
+        label: "客户简称",
+        prop: "educationName",
+      },
+    },
+    {
+      attrs: {
+        label: "应收金额",
+        prop: "educationName",
+      },
+    },
+    {
+      attrs: {
+        label: "收款金额",
+        prop: "amount",
+      },
+      render(val) {
+        return proxy.moneyFormat(val, 2);
+      },
+    },
+    {
+      attrs: {
+        label: "未收金额",
+        prop: "amount",
+      },
+      render(val) {
+        return proxy.moneyFormat(val, 2);
+      },
+    },
+    {
+      attrs: {
+        label: "出货日期",
+        prop: "amount",
+      },
+    },
+    {
+      attrs: {
+        label: "账龄级别",
+        prop: "amount",
+      },
+    },
+    // {
+    //   attrs: {
+    //     label: "审批状态",
+    //     prop: "status",
+    //     width: 100,
+    //   },
+    //   render(type) {
+    //     return proxy.dictValueLabel(type, statusData.value);
+    //   },
+    // },
+    {
+      attrs: {
+        label: "操作",
+        width: "120",
+        align: "center",
+      },
+      renderHTML(row) {
+        return row.createUser == proxy.useUserStore().user.userId
+          ? [
+              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("/report/finance/accountsPayablePage", sourceList.value.pagination)
+    .then((res) => {
+      sourceList.value.data = res.rows;
+      console.log(res.rows, "wadaw");
+      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,
+    },
+  });
+};
+
+const exportExcel = () => {
+  proxy.msgTip("正在导出,请稍后", 2);
+  proxy
+    .postTwo(
+      "/report/finance/accountsPayableExportExcel",
+      sourceList.value.pagination
+    )
+    .then((res) => {
+      proxy.downloadFile(res, "应付账款汇总.xlsx");
+    });
+  return;
+  proxy.msgTip("正在导出,请稍后", 2);
+  const wb = XLSX.utils.table_to_book(document.querySelector("#my-table")); // 关联dom节点
+  // 设置百分比列的单元格样式
+  const percentStyle = {
+    font: { bold: true },
+    fill: { fgColor: { rgb: "FFFF00" } },
+    border: { top: { style: "thin" }, bottom: { style: "thin" } },
+  };
+
+  // if (wb.Sheets.Sheet1) {
+  //   // 达成率单元格的key开头
+  //   let cellKey = "";
+  //   for (const key in wb.Sheets.Sheet1) {
+  //     let value = wb.Sheets.Sheet1[key];
+  //     if (value && value.v == "月达成率") {
+  //       cellKey = key.match(/[a-zA-Z]+/g)[0];
+  //     }
+  //     // key有包含cellKey的
+  //     if (cellKey && key.includes(cellKey)) {
+  //       // 单元格的样式
+  //       wb.Sheets.Sheet1[key].s = percentStyle;
+  //       // 用于指定单元格中显示值的格式,例如日期格式、百分比格式等
+  //       wb.Sheets.Sheet1[key].z = "0.00%";
+  //     }
+  //   }
+  // }
+  const wbout = XLSX.write(wb, {
+    bookType: "xlsx",
+    bookSST: true,
+    type: "array",
+  });
+  try {
+    FileSaver.saveAs(
+      new Blob([wbout], {
+        type: "application/octet-stream",
+      }),
+      "快递充值汇总.xlsx"
+    );
+  } catch (e) {
+    console.log(e, wbout);
+  }
+  return wbout;
+};
+
+const objectSpanMethod = ({ row, column, rowIndex, columnIndex }) => {
+  // 手动配置合计列
+  if (rowIndex == sourceList.value.data.length - 1) {
+    if (columnIndex == 0) {
+      return {
+        rowspan: 1,
+        colspan: 2,
+      };
+    } else if (columnIndex == 1) {
+      return {
+        rowspan: 1,
+        colspan: 0,
+      };
+    } else {
+      return {
+        rowspan: 1,
+        colspan: 1,
+      };
+    }
+  }
+};
+
+const getRowClass = ({ row, rowIndex }) => {
+  if (rowIndex == sourceList.value.data.length - 1) {
+    return "sumRow";
+  }
+  return "";
+};
+
+const handleCurrentChange = (val) => {
+  sourceList.value.pagination.pageNum = val;
+  getList();
+};
+
+const handleSizeChange = (val) => {
+  sourceList.value.pagination.pageSize = val;
+  getList();
+};
+
+const changeData = (item) => {
+  let data = {
+    idStr: item.idStr,
+    year: sourceList.value.pagination.year,
+    remark: item.remark,
+  };
+  for (let i = 1; i <= 12; i++) {
+    data["month" + i + "TaxAdjust"] = item.monthData[i].taxAdjustAmount;
+  }
+  proxy.post("/payableBalance/edit", data).then((res) => {});
+};
+</script>
+
+<style lang="scss" scoped>
+.tenant {
+  padding: 20px;
+}
+:deep(
+    .el-table .el-table__header-wrapper th,
+    .el-table .el-table__fixed-header-wrapper th
+  ) {
+  height: auto !important;
+}
+:deep(.el-table th.el-table__cell) {
+  background: #fff !important;
+}
+:deep(.el-table .el-table__cell) {
+  padding: 0 !important;
+}
+:deep(.el-table .cell) {
+  padding: 0 8px !important;
+  font-size: 12px !important;
+}
+
+:deep(.sumRow) {
+  background-color: #f5f7fa !important;
+  .el-table-fixed-column--left,
+  .el-table-fixed-column--right {
+    background-color: #f5f7fa !important;
+  }
+}
+</style>