浏览代码

Merge branch 'stage'

asd26269546 1 年之前
父节点
当前提交
6066b4cb42

二进制
src/assets/images/account-icon.png


+ 5 - 0
src/assets/styles/element-ui.scss

@@ -155,4 +155,9 @@
   background: #fafafa!important;
   -webkit-text-fill-color:#606266!important;
   color:#606266!important;
+}
+
+.el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{
+  color:#999!important;
+  -webkit-text-fill-color:#999!important;
 }

+ 4 - 4
src/components/PDF/contractPDF.vue

@@ -211,14 +211,14 @@
             style="width: 100px; text-align: center"
           ></div>
           <div class="contentRow" style="width: 100px; text-align: center">
-            {{ statistics("productQuantity", 0) }}
+            {{ statistics("productQuantity", 4) }}
           </div>
           <div
             class="contentRow"
             style="width: 100px; text-align: center"
           ></div>
           <div class="contentRow" style="width: 100px; text-align: center">
-            {{ statistics("amount", 2) }}
+            {{ statistics("amount", 4) }}
           </div>
         </div>
         <!-- <div v-if="printDetails.quotationPayList && printDetails.quotationPayList.length > 0">
@@ -235,7 +235,7 @@
             FREIGHT COST:
           </div>
           <div class="contentRow" style="width: 100px; text-align: center">
-            {{ statisticsTwo("amount", 2) }}
+            {{ statisticsTwo("amount", 4) }}
           </div>
         </div>
         <div class="baseRow" style="display: flex">
@@ -246,7 +246,7 @@
             TOTAL PRICE:
           </div>
           <div class="contentRow" style="width: 100px; text-align: center">
-            {{ printDetails.totalAmount }}
+            {{ moneyFormat(printDetails.totalAmount, 4) }}
           </div>
         </div>
         <div

+ 296 - 70
src/components/PDF/paymentPDF.vue

@@ -3,44 +3,141 @@
     <div id="pdfDom" style="width: 776px">
       <div style="padding: 60px; font-size: 12px !important; color: black">
         <div style="font-size: 16px; text-align: center; padding: 8px">
-          <span>采购付款</span>
+          <span
+            >采购付款(
+            {{ dictValueLabel(printDetails.type, payMethod) }})</span
+          >
         </div>
         <div style="padding: 8px 0">
           <span>创建时间: {{ printDetails.createTime }}</span>
         </div>
         <div style="border: 1px solid black">
           <div style="display: flex; border-bottom: 1px solid black">
-            <div style="width: 150px; border-right: 1px solid black; padding: 8px">创建人</div>
+            <div
+              style="width: 150px; border-right: 1px solid black; padding: 8px"
+            >
+              创建人
+            </div>
             <div style="width: calc(100% - 150px); padding: 8px">
               {{ dictValueLabel(printDetails.createUser, userList) }}
             </div>
           </div>
           <div style="display: flex; border-bottom: 1px solid black">
-            <div style="width: 150px; border-right: 1px solid black; padding: 8px">创建人部门</div>
+            <div
+              style="width: 150px; border-right: 1px solid black; padding: 8px"
+            >
+              创建人部门
+            </div>
             <div style="width: calc(100% - 150px); padding: 8px">
               {{ dictValueLabel(printDetails.deptId, deptList) }}
             </div>
           </div>
           <div style="display: flex; border-bottom: 1px solid black">
-            <div style="width: 150px; border-right: 1px solid black; padding: 4px 8px; display: flex; align-items: center">费用明细</div>
+            <div
+              style="
+                width: 150px;
+                border-right: 1px solid black;
+                padding: 4px 8px;
+                display: flex;
+                align-items: center;
+              "
+            >
+              费用明细
+            </div>
             <div style="width: calc(100% - 150px)">
               <div style="border-bottom: 1px solid black; display: flex">
-                <div style="width: 120px; padding: 4px 8px; border-right: 1px solid black; text-align: center">采购合同</div>
-                <div style="width: calc(100% - 340px); padding: 4px 8px; border-right: 1px solid black; text-align: center">款项说明</div>
-                <div style="width: 80px; padding: 4px 8px; border-right: 1px solid black; text-align: center">货币</div>
-                <div style="width: 140px; padding: 4px 8px; text-align: center">付款金额</div>
+                <div
+                  style="
+                    width: 120px;
+                    padding: 4px 8px;
+                    border-right: 1px solid black;
+                    text-align: center;
+                  "
+                >
+                  采购合同
+                </div>
+                <div
+                  style="
+                    width: calc(100% - 340px);
+                    padding: 4px 8px;
+                    border-right: 1px solid black;
+                    text-align: center;
+                  "
+                >
+                  款项说明
+                </div>
+                <div
+                  style="
+                    width: 80px;
+                    padding: 4px 8px;
+                    border-right: 1px solid black;
+                    text-align: center;
+                  "
+                >
+                  货币
+                </div>
+                <div style="width: 140px; padding: 4px 8px; text-align: center">
+                  付款金额
+                </div>
               </div>
-              <template v-if="printDetails.payDetailVoList && printDetails.payDetailVoList.length > 0">
-                <div v-for="(item, index) in printDetails.payDetailVoList" :key="index">
-                  <div :style="index + 1 !== printDetails.payDetailVoList.length ? 'border-bottom: 1px solid black;  display: flex' : ' display: flex'">
-                    <div style="width: 120px; padding: 4px 8px; border-right: 1px solid black; display: flex; align-items: center">
+              <template
+                v-if="
+                  printDetails.payDetailVoList &&
+                  printDetails.payDetailVoList.length > 0
+                "
+              >
+                <div
+                  v-for="(item, index) in printDetails.payDetailVoList"
+                  :key="index"
+                >
+                  <div
+                    :style="
+                      index + 1 !== printDetails.payDetailVoList.length
+                        ? 'border-bottom: 1px solid black;  display: flex'
+                        : ' display: flex'
+                    "
+                  >
+                    <div
+                      style="
+                        width: 120px;
+                        padding: 4px 8px;
+                        border-right: 1px solid black;
+                        display: flex;
+                        align-items: center;
+                      "
+                    >
                       {{ item.purchaseCode }}
                     </div>
-                    <div style="width: calc(100% - 340px); padding: 4px 8px; border-right: 1px solid black; display: flex; align-items: center">
+                    <div
+                      style="
+                        width: calc(100% - 340px);
+                        padding: 4px 8px;
+                        border-right: 1px solid black;
+                        display: flex;
+                        align-items: center;
+                      "
+                    >
                       {{ item.remark }}
                     </div>
-                    <div style="width: 80px; padding: 4px 8px; border-right: 1px solid black; display: flex; align-items: center">人民币</div>
-                    <div style="width: 140px; padding: 4px 8px; display: flex; align-items: center">
+                    <div
+                      style="
+                        width: 80px;
+                        padding: 4px 8px;
+                        border-right: 1px solid black;
+                        display: flex;
+                        align-items: center;
+                      "
+                    >
+                      人民币
+                    </div>
+                    <div
+                      style="
+                        width: 140px;
+                        padding: 4px 8px;
+                        display: flex;
+                        align-items: center;
+                      "
+                    >
                       {{ item.money }}
                     </div>
                   </div>
@@ -49,61 +146,175 @@
             </div>
           </div>
           <div style="display: flex; border-bottom: 1px solid black">
-            <div style="width: 150px; border-right: 1px solid black; padding: 8px">总报销金额</div>
+            <div
+              style="width: 150px; border-right: 1px solid black; padding: 8px"
+            >
+              总报销金额
+            </div>
             <div style="width: calc(100% - 150px); display: flex">
-              <div style="width: calc(100% - 140px); padding: 8px; border-right: 1px solid black">{{ NumberToChinese(computeMoney()) }}</div>
+              <div
+                style="
+                  width: calc(100% - 140px);
+                  padding: 8px;
+                  border-right: 1px solid black;
+                "
+              >
+                {{ NumberToChinese(computeMoney()) }}
+              </div>
               <div style="width: 140px; padding: 8px">{{ computeMoney() }}</div>
             </div>
           </div>
           <div style="display: flex; border-bottom: 1px solid black">
-            <div style="width: 150px; border-right: 1px solid black; padding: 8px">单据数量</div>
+            <div
+              style="width: 150px; border-right: 1px solid black; padding: 8px"
+            >
+              单据数量
+            </div>
             <div style="width: calc(100% - 150px); padding: 8px">
               {{ printDetails.receiptsNum }}
             </div>
           </div>
           <div style="display: flex; border-bottom: 1px solid black">
-            <div style="width: 150px; border-right: 1px solid black; padding: 0 8px; display: flex; align-items: center">收款信息</div>
+            <div
+              style="
+                width: 150px;
+                border-right: 1px solid black;
+                padding: 0 8px;
+                display: flex;
+                align-items: center;
+              "
+            >
+              收款信息
+            </div>
             <div style="width: calc(100% - 150px)">
               <div style="border-bottom: 1px solid black; display: flex">
-                <div style="width: 19%; padding: 0 8px; border-right: 1px solid black; text-align: center">支付方式</div>
-                <div style="width: 27%; padding: 0 8px; border-right: 1px solid black; text-align: center">收款方户名</div>
-                <div style="width: 27%; padding: 0 8px; border-right: 1px solid black; text-align: center">开户行</div>
-                <div style="width: 27%; padding: 0 8px; text-align: center">收款方账号</div>
+                <div
+                  style="
+                    width: 19%;
+                    padding: 0 8px;
+                    border-right: 1px solid black;
+                    text-align: center;
+                  "
+                >
+                  支付方式
+                </div>
+                <div
+                  style="
+                    width: 27%;
+                    padding: 0 8px;
+                    border-right: 1px solid black;
+                    text-align: center;
+                  "
+                >
+                  收款方户名
+                </div>
+                <div
+                  style="
+                    width: 27%;
+                    padding: 0 8px;
+                    border-right: 1px solid black;
+                    text-align: center;
+                  "
+                >
+                  开户行
+                </div>
+                <div style="width: 27%; padding: 0 8px; text-align: center">
+                  收款方账号
+                </div>
               </div>
               <div style="display: flex">
-                <div style="width: 19%; padding: 0 8px; border-right: 1px solid black; display: flex; align-items: center">
+                <div
+                  style="
+                    width: 19%;
+                    padding: 0 8px;
+                    border-right: 1px solid black;
+                    display: flex;
+                    align-items: center;
+                  "
+                >
                   {{ dictValueLabel(printDetails.payType, fundsPaymentMethod) }}
                 </div>
-                <div style="width: 27%; padding: 0 8px; border-right: 1px solid black; display: flex; align-items: center">
+                <div
+                  style="
+                    width: 27%;
+                    padding: 0 8px;
+                    border-right: 1px solid black;
+                    display: flex;
+                    align-items: center;
+                  "
+                >
                   {{ printDetails.name }}
                 </div>
-                <div style="width: 27%; padding: 0 8px; border-right: 1px solid black; display: flex; align-items: center">
+                <div
+                  style="
+                    width: 27%;
+                    padding: 0 8px;
+                    border-right: 1px solid black;
+                    display: flex;
+                    align-items: center;
+                  "
+                >
                   {{ printDetails.openingBank }}
                 </div>
-                <div style="width: 27%; padding: 0 8px; display: flex; align-items: center">
+                <div
+                  style="
+                    width: 27%;
+                    padding: 0 8px;
+                    display: flex;
+                    align-items: center;
+                  "
+                >
                   {{ printDetails.accountOpening }}
                 </div>
               </div>
             </div>
           </div>
           <div style="display: flex; border-bottom: 1px solid black">
-            <div style="width: 150px; border-right: 1px solid black; padding: 8px">电子发票(PDF/JPG)</div>
-            <div style="width: calc(100% - 150px); padding: 8px">{{ printDetails.electronicInvoiceText }}</div>
+            <div
+              style="width: 150px; border-right: 1px solid black; padding: 8px"
+            >
+              电子发票(PDF/JPG)
+            </div>
+            <div style="width: calc(100% - 150px); padding: 8px">
+              {{ printDetails.electronicInvoiceText }}
+            </div>
           </div>
           <div style="display: flex">
-            <div style="width: 150px; border-right: 1px solid black; padding: 4px 8px; display: flex; align-items: center">审批流程</div>
+            <div
+              style="
+                width: 150px;
+                border-right: 1px solid black;
+                padding: 4px 8px;
+                display: flex;
+                align-items: center;
+              "
+            >
+              审批流程
+            </div>
             <div style="width: calc(100% - 150px)">
-              <template v-if="printDetails.recordList && printDetails.recordList.length > 0">
-                <div v-for="(item, index) in printDetails.recordList" :key="index">
+              <template
+                v-if="
+                  printDetails.recordList && printDetails.recordList.length > 0
+                "
+              >
+                <div
+                  v-for="(item, index) in printDetails.recordList"
+                  :key="index"
+                >
                   <div
                     :style="
                       index + 1 !== printDetails.recordList.length
                         ? 'border-bottom: 1px solid black; padding: 4px 8px; display: flex'
                         : 'padding: 4px 8px; display: flex'
-                    ">
-                    <div style="width: calc(100% - 120px); word-wrap: break-word">
+                    "
+                  >
+                    <div
+                      style="width: calc(100% - 120px); word-wrap: break-word"
+                    >
                       <span>{{ item.nodeName }}: </span>
-                      <span style="padding-left: 4px">{{ item.processedUser }}</span>
+                      <span style="padding-left: 4px">{{
+                        item.processedUser
+                      }}</span>
                       <span style="padding-left: 4px">{{ item.remark }}</span>
                     </div>
                     <div style="width: 120px">{{ item.processedDate }}</div>
@@ -115,7 +326,9 @@
         </div>
         <div style="padding-top: 16px">
           <span>打印时间: {{ presentTime }}</span>
-          <span style="padding-left: 32px">打印人: {{ useUserStore().user.nickName }}</span>
+          <span style="padding-left: 32px"
+            >打印人: {{ useUserStore().user.nickName }}</span
+          >
         </div>
       </div>
     </div>
@@ -129,26 +342,20 @@ import { NumberToChinese } from "@/utils/util.js";
 
 const { proxy } = getCurrentInstance();
 const fundsPaymentMethod = ref([]);
+const payMethod = ref([]);
 const userList = ref([]);
 const deptList = ref([]);
 const getDict = () => {
-  proxy
-    .post("/dictTenantData/page", {
-      pageNum: 1,
-      pageSize: 999,
-      dictCode: "funds_payment_method",
-      tenantId: useUserStore().user.tenantId,
-    })
-    .then((res) => {
-      if (res.rows && res.rows.length > 0) {
-        fundsPaymentMethod.value = res.rows.map((item) => {
-          return {
-            label: item.dictValue,
-            value: item.dictKey,
-          };
-        });
-      }
-    });
+  proxy.getDictOne(["funds_payment_method", "pay_method"]).then((res) => {
+    fundsPaymentMethod.value = res["funds_payment_method"].map((x) => ({
+      label: x.dictValue,
+      value: x.dictKey,
+    }));
+    payMethod.value = res["pay_method"].map((x) => ({
+      label: x.dictValue,
+      value: x.dictKey,
+    }));
+  });
   proxy
     .get("/tenantUser/list", {
       pageNum: 1,
@@ -188,10 +395,17 @@ const printDetails = ref({});
 const presentTime = ref(moment().format("yyyy-MM-DD HH:mm:ss"));
 const computeMoney = () => {
   let money = 0;
-  if (printDetails.value.payDetailVoList && printDetails.value.payDetailVoList.length > 0) {
+  if (
+    printDetails.value.payDetailVoList &&
+    printDetails.value.payDetailVoList.length > 0
+  ) {
     for (let i = 0; i < printDetails.value.payDetailVoList.length; i++) {
       if (printDetails.value.payDetailVoList[i].money) {
-        money = Number(parseFloat(Number(money) + Number(printDetails.value.payDetailVoList[i].money)).toFixed(2));
+        money = Number(
+          parseFloat(
+            Number(money) + Number(printDetails.value.payDetailVoList[i].money)
+          ).toFixed(2)
+        );
       }
     }
   }
@@ -205,28 +419,40 @@ onMounted(() => {
     proxy.post("/pay/detail", { id: props.rowData.id }).then((res) => {
       printDetails.value = res;
       if (printDetails.value.createUser) {
-        let data = userList.value.filter((item) => item.value == printDetails.value.createUser);
+        let data = userList.value.filter(
+          (item) => item.value == printDetails.value.createUser
+        );
         if (data && data.length > 0) {
           printDetails.value.deptId = data[0].deptId;
         }
       }
-      proxy.post("/fileInfo/getList", { businessIdList: [props.rowData.id] }).then((resFile) => {
-        let electronicInvoiceText = "";
-        if (resFile[props.rowData.id] && resFile[props.rowData.id].length > 0) {
-          for (let i = 0; i < resFile[props.rowData.id].length; i++) {
-            if (i === 0) {
-              electronicInvoiceText = resFile[props.rowData.id][0].fileName;
-            } else {
-              electronicInvoiceText = electronicInvoiceText + ", " + resFile[props.rowData.id][i].fileName;
+      proxy
+        .post("/fileInfo/getList", { businessIdList: [props.rowData.id] })
+        .then((resFile) => {
+          let electronicInvoiceText = "";
+          if (
+            resFile[props.rowData.id] &&
+            resFile[props.rowData.id].length > 0
+          ) {
+            for (let i = 0; i < resFile[props.rowData.id].length; i++) {
+              if (i === 0) {
+                electronicInvoiceText = resFile[props.rowData.id][0].fileName;
+              } else {
+                electronicInvoiceText =
+                  electronicInvoiceText +
+                  ", " +
+                  resFile[props.rowData.id][i].fileName;
+              }
             }
           }
-        }
-        printDetails.value.electronicInvoiceText = electronicInvoiceText;
-      });
-      if (res.flowExampleId) {
-        proxy.post("/flowExample/getApprovalRecord", { id: res.flowExampleId }).then((record) => {
-          printDetails.value.recordList = record.recordList;
+          printDetails.value.electronicInvoiceText = electronicInvoiceText;
         });
+      if (res.flowExampleId) {
+        proxy
+          .post("/flowExample/getApprovalRecord", { id: res.flowExampleId })
+          .then((record) => {
+            printDetails.value.recordList = record.recordList;
+          });
       }
     });
   }

+ 25 - 0
src/components/byForm/index.vue

@@ -9,6 +9,7 @@
       ref="byForm"
       :disabled="formOption.disabled || false">
       <template v-for="i in formConfig" :key="i.model">
+        
         <el-form-item
           :label="i.label"
           :prop="i.prop"
@@ -23,6 +24,18 @@
               : '100%'
           "
           :class="i.type == 'json' ? (i.isHide ? 'by-form-json dn' : 'by-form-json') : i.isHide ? 'dn' : ''">
+          <template #label>
+            <el-popover placement="top"  trigger="hover" :width="i.tipWidth"  v-if="i.isTip">
+              <template #reference>
+                <span 
+                  style="color:red">
+                  {{ i.label }}
+                </span>
+              </template>
+              <div v-html="i.tipHtml"></div>
+            </el-popover>
+            <span v-else> {{ i.label }}</span>
+          </template>
           <el-input
             v-if="i.type == 'input'"
             v-model="formData[i.prop]"
@@ -225,6 +238,9 @@ defineProps({
     default: false,
   },
 });
+
+
+
 const formTableChange = (e, scope, column) => {
   if (column.fn) {
     column.fn(e, scope);
@@ -251,6 +267,10 @@ const handleRemove = (file) => {
   fileListCopy.value.splice(index, 1);
 };
 
+const getLegacyData = (i) => {
+  console.log(i)
+};
+
 const handleBeforeUpload = async (file) => {
   const res = await proxy.post("/fileInfo/getSing", { fileName: file.name });
   uploadData.value = res.uploadBody;
@@ -269,6 +289,8 @@ const emit = defineEmits(["update:modelValue"]);
 const formData = computed(() => {
   return proxy.modelValue;
 });
+
+
 const formDataReset = ref({ ...proxy.modelValue });
 const commonsEmit = (prop, item) => {
   if (item.type == "input" && item.itemType == "number") {
@@ -434,6 +456,9 @@ loadInit();
 </script>
 
 <style>
+.box-item{
+  background-color: red;
+}
 .form-title {
   font-size: 14px;
   font-weight: bold;

文件差异内容过多而无法显示
+ 498 - 146
src/components/process/Contract.vue


+ 319 - 6
src/components/process/ContractAlteration.vue

@@ -1,6 +1,6 @@
 <template>
   <div style="width: 100%; padding: 0px 15px">
-    <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="submit">
+    <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="submit" v-if='formShowType'>
       <template #seller>
         <div style="width: 100%">
           <el-form-item prop="sellCorporationId">
@@ -10,16 +10,39 @@
           </el-form-item>
           <el-row style="margin-top: 20px; width: 100%">
             <el-col :span="8">
-              <el-form-item label="地址" prop="sellCountryName">
+              <el-form-item label="地址" prop="sellCountryName" class="dizhi">
+                <template #label>
+                  <el-tooltip
+                    class="box-item"
+                    effect="dark"
+                    v-if="route.query.processType"
+                    placement="top-start"
+                    :content="formOption.formDataCopy.sellCountryName + ' ' + 
+                    formOption.formDataCopy.sellProvinceName + ' ' + 
+                    formOption.formDataCopy.sellCityName + ' ' + 
+                    formOption.formDataCopy.sellAddress"
+                  >
+                    <span 
+                      :style="formOption.formDataCopy.sellCountryName != formData.data.sellCountryName ||
+                      formOption.formDataCopy.sellProvinceName != formData.data.sellProvinceName ||
+                      formOption.formDataCopy.sellCityName != formData.data.sellCityName || 
+                      formOption.formDataCopy.sellAddress != formData.data.sellAddress
+                      ? 'color:red' : ''">
+                      地址
+                    </span>
+                  </el-tooltip>
+                </template>
                 <el-input v-model="formData.data.sellCountryName" placeholder="请输入国家" />
               </el-form-item>
             </el-col>
-            <el-col :span="8">
+            <el-col :span="1"></el-col>
+            <el-col :span="7">
               <el-form-item label=" " prop="sellProvinceName">
                 <el-input v-model="formData.data.sellProvinceName" placeholder="请输入省/州" />
               </el-form-item>
             </el-col>
-            <el-col :span="8">
+            <el-col :span="1"></el-col>
+            <el-col :span="7">
               <el-form-item label=" " prop="sellCityName">
                 <el-input v-model="formData.data.sellCityName" placeholder="请输入城市" />
               </el-form-item>
@@ -35,10 +58,28 @@
           <el-row style="margin-top: 20px; width: 100%">
             <el-col :span="8">
               <el-form-item label="联系人" prop="sellContactName">
+                <template #label>
+                  <el-tooltip
+                    class="box-item"
+                    effect="dark"
+                    v-if="route.query.processType"
+                    placement="top-start"
+                    :content="formOption.formDataCopy.sellContactName + ' ' +
+                    formOption.formDataCopy.sellContactNumber"
+                  >
+                    <span 
+                      :style="formOption.formDataCopy.sellContactName != formData.data.sellContactName ||
+                      formOption.formDataCopy.sellContactNumber != formData.data.sellContactNumber
+                      ? 'color:red' : ''">
+                      联系人
+                    </span>
+                  </el-tooltip>
+                </template>
                 <el-input v-model="formData.data.sellContactName" placeholder="请输入联系人" />
               </el-form-item>
             </el-col>
-            <el-col :span="16">
+            <el-col :span="1"></el-col>
+            <el-col :span="15">
               <el-form-item label=" " prop="sellContactNumber">
                 <el-input v-model="formData.data.sellContactNumber" placeholder="请输入联系人电话" />
               </el-form-item>
@@ -57,6 +98,27 @@
             <el-row style="margin-top: 20px; width: 100%">
               <el-col :span="6">
                 <el-form-item label="地址" prop="countryId">
+                  <template #label>
+                  <el-tooltip
+                    class="box-item"
+                    effect="dark"
+                    v-if="route.query.processType"
+                    placement="top-start"
+                    :content="formOption.formDataCopy.buyCountryName + ' ' + 
+                    formOption.formDataCopy.buyProvinceName + ' ' + 
+                    formOption.formDataCopy.sellCityName + ' ' + 
+                    formOption.formDataCopy.buyAddress"
+                  >
+                    <span 
+                      :style="formOption.formDataCopy.buyCountryId != formData.data.countryId ||
+                      formOption.formDataCopy.buyProvinceId != formData.data.buyProvinceId ||
+                      formOption.formDataCopy.buyCountryId != formData.data.buyCountryId || 
+                      formOption.formDataCopy.buyAddress != formData.data.buyAddress
+                      ? 'color:red' : ''">
+                      地址
+                    </span>
+                  </el-tooltip>
+                </template>
                   <el-select v-model="formData.data.countryId" placeholder="国家" filterable @change="(val) => getCityData(val, '20', true)">
                     <el-option v-for="item in countryData" :label="formData.data.contractType == '2' ? item.chineseName : item.name" :value="item.id">
                     </el-option>
@@ -96,6 +158,23 @@
             <el-row style="margin-top: 20px; width: 100%">
               <el-col :span="8">
                 <el-form-item label="联系人" prop="buyContactName">
+                  <template #label>
+                    <el-tooltip
+                      class="box-item"
+                      effect="dark"
+                      v-if="route.query.processType"
+                      placement="top-start"
+                      :content="formOption.formDataCopy.buyContactName + ' ' +
+                      formOption.formDataCopy.buyContactNumber"
+                    >
+                      <span 
+                        :style="formOption.formDataCopy.buyContactName != formData.data.buyContactName ||
+                        formOption.formDataCopy.buyContactNumber != formData.data.buyContactNumber
+                        ? 'color:red' : ''">
+                        联系人
+                      </span>
+                    </el-tooltip>
+                  </template>
                   <el-autocomplete
                     v-model="formData.data.buyContactName"
                     :fetch-suggestions="querySearchPerson"
@@ -253,6 +332,21 @@
           <el-row style="margin-top: 20px; width: 100%">
             <el-col :span="4">
               <el-form-item label="币种" prop="currency">
+                <template #label>
+                  <el-tooltip
+                    class="box-item"
+                    effect="dark"
+                    v-if="route.query.processType"
+                    placement="top-start"
+                    :content="formOption.formDataCopy.currencyLabel"
+                  >
+                    <span 
+                      :style="formOption.formDataCopy.currency != formData.data.currency
+                      ? 'color:red' : ''">
+                      币种
+                    </span>
+                  </el-tooltip>
+                </template>
                 <el-select v-model="formData.data.currency" placeholder="请选择币种" style="width: 100%">
                   <el-option v-for="item in accountCurrency" :key="item.value" :label="item.label" :value="item.value" />
                 </el-select>
@@ -260,6 +354,21 @@
             </el-col>
             <el-col :span="6">
               <el-form-item label="合同总金额" prop="amount">
+                <template #label>
+                  <el-tooltip
+                    class="box-item"
+                    effect="dark"
+                    v-if="route.query.processType"
+                    placement="top-start"
+                    :content="formOption.formDataCopy.amount"
+                  >
+                    <span 
+                      :style="formOption.formDataCopy.amount != formData.data.amount
+                      ? 'color:red' : ''">
+                      合同总金额
+                    </span>
+                  </el-tooltip>
+                </template>
                 <el-input v-model="formData.data.amount" placeholder="合同总金额" disabled />
               </el-form-item>
             </el-col>
@@ -267,6 +376,21 @@
           <el-row style="margin-top: 20px; width: 100%">
             <el-col :span="7">
               <el-form-item label="付款方式" prop="paymentMethod">
+                <template #label>
+                  <el-tooltip
+                    class="box-item"
+                    effect="dark"
+                    v-if="route.query.processType"
+                    placement="top-start"
+                    :content="formOption.formDataCopy.paymentMethodName"
+                  >
+                    <span 
+                      :style="formOption.formDataCopy.paymentMethod != formData.data.paymentMethod
+                      ? 'color:red' : ''">
+                      付款方式
+                    </span>
+                  </el-tooltip>
+                </template>
                 <el-select v-model="formData.data.paymentMethod" placeholder="请选择付款方式" style="width: 100%">
                   <el-option v-for="item in fundsPaymentMethod" :key="item.value" :label="item.label" :value="item.value" />
                 </el-select>
@@ -274,6 +398,21 @@
             </el-col>
             <el-col :span="7">
               <el-form-item label="预付比例 (%)" prop="advanceRatio">
+                <template #label>
+                  <el-tooltip
+                    class="box-item"
+                    effect="dark"
+                    v-if="route.query.processType"
+                    placement="top-start"
+                    :content="formOption.formDataCopy.advanceRatio"
+                  >
+                    <span 
+                      :style="formOption.formDataCopy.advanceRatio != formData.data.advanceRatio
+                      ? 'color:red' : ''">
+                      预付比例 (%)
+                    </span>
+                  </el-tooltip>
+                </template>
                 <el-input-number
                   onmousewheel="return false;"
                   v-model="formData.data.advanceRatio"
@@ -287,6 +426,21 @@
             </el-col>
             <el-col :span="7">
               <el-form-item label="收款账号" prop="shroffAccountId">
+                <template #label>
+                  <el-tooltip
+                    class="box-item"
+                    effect="dark"
+                    v-if="route.query.processType"
+                    placement="top-start"
+                    :content="formOption.formDataCopy.shroffAccountName"
+                  >
+                    <span 
+                      :style="formOption.formDataCopy.shroffAccountId != formData.data.shroffAccountId
+                      ? 'color:red' : ''">
+                      收款账号
+                    </span>
+                  </el-tooltip>
+                </template>
                 <el-select v-model="formData.data.shroffAccountId" placeholder="请选择收款账号" style="width: 100%" @change="changeShroffAccount">
                   <el-option v-for="item in accountList" :key="item.value" :label="item.label" :value="item.value" />
                 </el-select>
@@ -342,6 +496,21 @@
           <el-row style="margin-top: 20px; width: 100%">
             <el-col :span="7">
               <el-form-item label="贸易方式" prop="tradeMethods">
+                <template #label>
+                  <el-tooltip
+                    class="box-item"
+                    effect="dark"
+                    v-if="route.query.processType"
+                    placement="top-start"
+                    :content="formOption.formDataCopy.tradeMethodsName"
+                  >
+                    <span 
+                      :style="formOption.formDataCopy.tradeMethods != formData.data.tradeMethods
+                      ? 'color:red' : ''">
+                      贸易方式
+                    </span>
+                  </el-tooltip>
+                </template>
                 <el-select v-model="formData.data.tradeMethods" placeholder="请选择贸易方式" style="width: 100%">
                   <el-option v-for="item in tradeMethods" :key="item.value" :label="item.label" :value="item.value" />
                 </el-select>
@@ -351,6 +520,21 @@
           <el-row style="margin-top: 20px; width: 100%">
             <el-col :span="7">
               <el-form-item label="运输方式" prop="transportMethod">
+                <template #label>
+                  <el-tooltip
+                    class="box-item"
+                    effect="dark"
+                    v-if="route.query.processType"
+                    placement="top-start"
+                    :content="formOption.formDataCopy.transportMethodName"
+                  >
+                    <span 
+                      :style="formOption.formDataCopy.transportMethod != formData.data.transportMethod
+                      ? 'color:red' : ''">
+                      贸易方式
+                    </span>
+                  </el-tooltip>
+                </template>
                 <el-select v-model="formData.data.transportMethod" placeholder="请选择运输方式" style="width: 100%">
                   <el-option v-for="item in shippingMethod" :key="item.value" :label="item.label" :value="item.value" />
                 </el-select>
@@ -358,6 +542,21 @@
             </el-col>
             <el-col :span="7">
               <el-form-item label="运输说明" prop="transportRemark">
+                <template #label>
+                  <el-tooltip
+                    class="box-item"
+                    effect="dark"
+                    v-if="route.query.processType"
+                    placement="top-start"
+                    :content="formOption.formDataCopy.transportRemark"
+                  >
+                    <span 
+                      :style="formOption.formDataCopy.transportRemark != formData.data.transportRemark
+                      ? 'color:red' : ''">
+                      运输说明
+                    </span>
+                  </el-tooltip>
+                </template>
                 <el-input v-model="formData.data.transportRemark" placeholder="请输入运输说明" />
               </el-form-item>
             </el-col>
@@ -365,6 +564,21 @@
           <el-row style="margin-top: 20px; width: 100%">
             <el-col :span="14">
               <el-form-item label="付款条件" prop="remark">
+                <template #label>
+                  <el-tooltip
+                    class="box-item"
+                    effect="dark"
+                    v-if="route.query.processType"
+                    placement="top-start"
+                    :content="formOption.formDataCopy.remark"
+                  >
+                    <span 
+                      :style="formOption.formDataCopy.remark != formData.data.remark
+                      ? 'color:red' : ''">
+                      付款条件
+                    </span>
+                  </el-tooltip>
+                </template>
                 <el-input v-model="formData.data.remark" :rows="2" type="textarea" placeholder="请输入付款条件" />
               </el-form-item>
             </el-col>
@@ -372,6 +586,21 @@
           <el-row style="margin-top: 20px; width: 100%">
             <el-col :span="7">
               <el-form-item label="交货期限 (天)" prop="deliveryTime">
+                <template #label>
+                  <el-tooltip
+                    class="box-item"
+                    effect="dark"
+                    v-if="route.query.processType"
+                    placement="top-start"
+                    :content="formOption.formDataCopy.deliveryTime"
+                  >
+                    <span 
+                      :style="formOption.formDataCopy.deliveryTime != formData.data.deliveryTime
+                      ? 'color:red' : ''">
+                      交货期限 (天)
+                    </span>
+                  </el-tooltip>
+                </template>
                 <el-input-number
                   onmousewheel="return false;"
                   v-model="formData.data.deliveryTime"
@@ -384,6 +613,21 @@
             </el-col>
             <el-col :span="7">
               <el-form-item label="质保期 (天)" prop="warranty">
+                <template #label>
+                  <el-tooltip
+                    class="box-item"
+                    effect="dark"
+                    v-if="route.query.processType"
+                    placement="top-start"
+                    :content="formOption.formDataCopy.warranty"
+                  >
+                    <span 
+                      :style="formOption.formDataCopy.warranty != formData.data.warranty
+                      ? 'color:red' : ''">
+                      交货期限 (天)
+                    </span>
+                  </el-tooltip>
+                </template>
                 <el-input-number
                   onmousewheel="return false;"
                   v-model="formData.data.warranty"
@@ -505,7 +749,8 @@ const customerUserList = ref([]);
 const accountList = ref([]);
 const productUnit = ref([]);
 const openProduct = ref(false);
-const activeName = ref("");
+const activeName = ref("1");
+const formShowType = ref(false);
 const formData = reactive({
   data: {
     contractType: "1",
@@ -534,6 +779,7 @@ const formOption = reactive({
   itemWidth: 100,
   rules: [],
   disabled: false,
+  formDataCopy:{},
 });
 const formConfig = computed(() => {
   return [
@@ -548,6 +794,7 @@ const formConfig = computed(() => {
       prop: "contractType",
       data: contractType.value,
       itemWidth: 25,
+      isTip:false,
     },
     {
       type: "select",
@@ -575,6 +822,8 @@ const formConfig = computed(() => {
       type: "slot",
       slotName: "commodity",
       label: "商品信息",
+      isTip:false,
+      tipHtml:'1'
     },
     {
       type: "slot",
@@ -598,6 +847,18 @@ const formConfig = computed(() => {
     },
   ];
 });
+
+const getDictName = (dictList, value) => {
+  let name = "";
+  dictList.forEach((item) => {
+    if (item.value == value) {
+      name = item.label;
+    }
+  });
+  console.log(value)
+  return name;
+};
+
 const rules = ref({
   contractType: [{ required: true, message: "请选择合同类型", trigger: "change" }],
   contractTemplateId: [{ required: true, message: "请选择合同模板", trigger: "change" }],
@@ -811,6 +1072,56 @@ const getDecisionAids = () => {
   if (formData.data.contractProductList && formData.data.contractProductList.length > 0) {
     data.productIdList = formData.data.contractProductList.map((item) => item.productId);
   }
+  proxy.post("/contract/detail", {
+    id:formData.data.oldContractId
+  }).then((res) => {
+    formOption.formDataCopy = res;
+    //比对formData.data.contractProductList和res.contractProductList 这两个数组是否相同
+    if(JSON.stringify(formData.data.contractProductList) != JSON.stringify(res.contractProductList)) {
+      formConfig.value[5].isTip = true;
+      formConfig.value[5].tipWidth = 500;
+      //修改tipHtml插入一个table
+      let tableHtml = `<table class="table table-bordered table-striped table-hover" style="width:500px">
+        <thead>
+          <tr>
+            <th>商品中文名</th>
+            <th>商品英文名</th>
+            <th>规格型号</th>
+            <th>数量</th>
+            <th>单价</th>
+          </tr>
+        </thead>
+        <tbody>`;
+      formData.data.contractProductList.forEach((item) => {
+        tableHtml += `<tr>
+          <td>${item.productCnName}</td >
+          <td>${item.productName}</td>
+          <td>${item.productModel}</td>
+          <td>${item.quantity}</td>
+          <td>${item.price}</td>
+        </tr>`;
+      });
+      tableHtml += `</tbody></table>`;
+      formConfig.value[5].tipHtml = tableHtml;
+    }
+    formShowType.value = true;
+    formOption.formDataCopy.transportMethodName = shippingMethod.value.find((item) => {
+      return item.value === res.transportMethod;
+    }).label;
+    formOption.formDataCopy.tradeMethodsName = tradeMethods.value.find((item) => {
+      return item.value === res.tradeMethods;
+    }).label;
+    formOption.formDataCopy.shroffAccountName = accountList.value.find((item) => {
+      return item.value === res.shroffAccountId;
+    }).label;
+    formOption.formDataCopy.paymentMethodName = fundsPaymentMethod.value.find((item) => {
+      return item.value === res.paymentMethod;
+    }).label;
+    formOption.formDataCopy.currencyLabel = accountCurrency.value.find((item) => {
+      return item.value === res.currency;
+    }).label;
+    console.log(formOption.formDataCopy.currencyLabel) 
+  })
   proxy.post("/contract/decisionAid", data).then((res) => {
     if (res.lastContractList && res.lastContractList.length > 0) {
       auxiliaryData.value[0].data = res.lastContractList.map((item) => {
@@ -1312,6 +1623,7 @@ onMounted(() => {
           formData.data[text] = res[text];
         }
       }
+      formShowType.value = true;
       formData.data.oldContractId = formData.data.id;
       delete formData.data.id;
       delete formData.data.code;
@@ -1355,6 +1667,7 @@ onMounted(() => {
       }
     });
   }
+
 });
 </script>
 

文件差异内容过多而无法显示
+ 478 - 190
src/components/process/PriceSheet.vue


+ 18 - 30
src/utils/request.js

@@ -153,37 +153,25 @@ service.interceptors.response.use(res => {
   }
 )
 // 通用下载方法
-export function download(url, params, filename, config) {
-  downloadLoadingInstance = ElLoading.service({
-    text: "正在下载数据,请稍候",
-    background: "rgba(0, 0, 0, 0.7)",
-  })
-  return service.post(url, params, {
-    transformRequest: [(params) => {
-      return tansParams(params)
-    }],
-    headers: {
-      'Content-Type': 'application/x-www-form-urlencoded'
-    },
-    responseType: 'blob',
-    ...config
-  }).then(async (data) => {
-    const isLogin = await blobValidate(data);
-    if (isLogin) {
-      const blob = new Blob([data])
-      saveAs(blob, filename)
-    } else {
-      const resText = await data.text();
-      const rspObj = JSON.parse(resText);
-      const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
-      ElMessage.error(errMsg);
+export function download(fileUrl, fileName) {
+  let xhr = new XMLHttpRequest();
+  //域名是华为云的
+  xhr.open("GET", `${fileUrl}`, true);
+  xhr.responseType = "blob";
+  xhr.send();
+  xhr.onreadystatechange = function () {
+    if (xhr.readyState === 4 && xhr.status === 200) {
+      let url = window.URL.createObjectURL(xhr.response);
+      const a = document.createElement("a");
+      a.href = url;
+      a.download = fileName; // 下载后文件名
+      a.style.display = "none";
+      document.body.appendChild(a);
+      a.click(); // 点击下载
+      window.URL.revokeObjectURL(a.href);
+      document.body.removeChild(a); // 下载完成移除元素
     }
-    downloadLoadingInstance.close();
-  }).catch((r) => {
-    console.error(r)
-    ElMessage.error('下载文件出现错误,请联系管理员!')
-    downloadLoadingInstance.close();
-  })
+  };
 }
 
 

+ 13 - 1
src/views/connect/E-mail/mail/com/mailList.vue

@@ -152,7 +152,19 @@
         </el-table-column>
         <el-table-column prop="subject" label="主题">
           <template #default="{ row, $index }">
-            <div class="contentClass" @click="handleRowClick(row, $index)">
+            <div
+              class="contentClass"
+              @click="handleRowClick(row, $index)"
+              :style="{
+                'font-weight':
+                  (row.flags && !row.flags.includes('6')) ||
+                  (row.flags !== undefined &&
+                    row.flags !== null &&
+                    row.flags === '')
+                    ? 700
+                    : '',
+              }"
+            >
               {{ row.subject }}
             </div>
           </template>

+ 3 - 2
src/views/dataBoard/board/customerAnalysis/index.vue

@@ -351,10 +351,11 @@ const onQuery = () => {
 const getCountryData = () => {
   proxy.post("/customizeArea/list", { parentId: "0" }).then((res) => {
     countryData.value = res;
-    queryForm.countryId = "44";
+    queryForm.countryId = "";
     let endData = new Date();
     let beginDate = new Date();
-    beginDate.setFullYear(endData.getFullYear() - 1);
+    beginDate.setMonth(0);
+    beginDate.setDate(1);
     queryForm.timeArr = [
       proxy.parseTime(beginDate, "{y}-{m}-{d}"),
       proxy.parseTime(endData, "{y}-{m}-{d}"),

+ 7 - 3
src/views/dataBoard/board/productAnalysis/index.vue

@@ -83,7 +83,7 @@
     <el-row style="margin-top: 20px" type="flex">
       <el-col :span="12">
         <div style="margin-right: 20px; background-color: white; padding: 20px; height: 100%">
-          <TitleInfo :content="'产品类排行'"></TitleInfo>
+          <TitleInfo :content="'产品类排行'"></TitleInfo>
           <div style="padding-top: 20px" v-loading="loadingTwo">
             <el-table
               :data="allData.productTypeRanking"
@@ -91,6 +91,7 @@
               style="width: 100%"
               max-height="30vh"
               @sort-change="sortChangeTwo">
+              <el-table-column type="index" width="50" />
               <el-table-column label="产品类型" prop="name" min-width="140" />
               <el-table-column label="销售量" prop="contractQuantity" sortable width="120" />
               <el-table-column label="销售额" prop="contractAmount" sortable width="120" />
@@ -108,12 +109,14 @@
             <el-table
               :data="allData.productRanking"
               :default-sort="{ prop: 'contractQuantity', order: 'descending' }"
-              style="width: 100%"
+              style="width: 100%" border 
               max-height="30vh"
               @sort-change="sortChangeThree">
+              <el-table-column type="index" width="50" />
               <el-table-column label="产品名称" prop="name" min-width="140" />
               <el-table-column label="销售量" prop="contractQuantity" sortable width="120" />
               <el-table-column label="销售额" prop="contractAmount" sortable width="120" />
+              
               <el-table-column label="采购量" prop="purchaseQuantity" sortable width="120" />
               <el-table-column label="采购额" prop="purchaseAmount" sortable width="120" />
               <!-- <el-table-column label="生产总量" prop="name" sortable width="120" /> -->
@@ -157,7 +160,8 @@ const getCountryData = () => {
     countryData.value = res;
     let endData = new Date();
     let beginDate = new Date();
-    beginDate.setFullYear(endData.getFullYear() - 1);
+    beginDate.setMonth(0);
+    beginDate.setDate(1);
     queryForm.timeArr = [proxy.parseTime(beginDate, "{y}-{m}-{d}"), proxy.parseTime(endData, "{y}-{m}-{d}")];
     queryForm.beginTime = queryForm.timeArr[0];
     queryForm.endTime = queryForm.timeArr[1];

+ 652 - 0
src/views/dataBoard/board/salesAnalysis/index - 副本.vue

@@ -0,0 +1,652 @@
+<template>
+  <div class="content">
+    <div class="bck">
+      <el-form :inline="true" :model="queryForm">
+        <!-- <el-form-item label="">
+          <el-date-picker
+            v-model="queryForm.aa"
+            type="month"
+            placeholder="月份"
+            @change="onQuery"
+          />
+        </el-form-item> -->
+        <el-form-item label="">
+          <el-radio-group v-model="queryForm.bb" size="large" @change="onQuery">
+            <el-radio-button label="本日" />
+            <el-radio-button label="本周" />
+            <el-radio-button label="本月" />
+            <el-radio-button label="今年" />
+            <el-radio-button label="其他" />
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item>
+          <el-date-picker
+            v-model="queryForm.timeArr"
+            type="daterange"
+            unlink-panels
+            range-separator="-"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            value-format="YYYY-MM-DD"
+            @change="onQuery"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="onQuery">搜索</el-button>
+          <el-button type="defualt" @click="onReset">重置</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div
+      class="bck statistics"
+      style="margin-top: 10px"
+      v-loading="statisticsLoading"
+    >
+      <div class="item first">
+        <div class="left_">
+          <div class="money">
+            {{ moneyFormat(allData.salesStatisticsData.amount, 2) }}
+          </div>
+          <div>销售额(¥)</div>
+        </div>
+        <div class="right_">
+          <div class="icon">
+            <img src="@/assets/images/portrait/icon_sales.png" alt="" />
+          </div>
+        </div>
+      </div>
+      <div class="item two">
+        <div class="left_">
+          <div class="money">
+            {{ allData.salesStatisticsData.contractCount }}
+          </div>
+          <div>订单(单)</div>
+        </div>
+        <div class="right_">
+          <div class="icon">
+            <img src="@/assets/images/portrait/icon_profits.png" alt="" />
+          </div>
+        </div>
+      </div>
+      <div class="item three">
+        <div class="left_">
+          <div class="money">
+            {{ allData.salesStatisticsData.customerCount }}
+          </div>
+          <div>下单客户数(人)</div>
+        </div>
+        <div class="right_">
+          <div class="icon">
+            <img src="@/assets/images/portrait/icon_email.png" alt="" />
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <div
+      class="bck scatter"
+      style="margin-top: 10px"
+      v-loading="scatterLoading"
+    >
+      <el-row>
+        <el-col :span="8">
+          <TitleInfo :content="titleList[0]"></TitleInfo>
+          <div ref="echartDomOne" style="height: 40vh"></div>
+        </el-col>
+        <el-col :span="16">
+          <div ref="echartDomTwo" style="height: 40vh"></div>
+        </el-col>
+      </el-row>
+    </div>
+
+    <div style="margin-top: 10px">
+      <el-row>
+        <el-col :span="12" class="bck" v-loading="salesLoading">
+          <TitleInfo :content="titleList[1]"></TitleInfo>
+          <div ref="echartDomOne22" style="height: 30vh"></div>
+          <div style="margin-top: 10px">
+            <byTable
+              :hideSearch="true"
+              :tableHeight="300"
+              :source="sourceList.salesData"
+              :pagination="sourceList.salesPagination"
+              :config="salesConfig"
+              :loading="salesLoading"
+              highlight-current-row
+              :selectConfig="[]"
+            >
+            </byTable>
+          </div>
+        </el-col>
+        <el-col :span="12" style="padding-left: 10px">
+          <div class="bck" v-loading="salesmanSalesLoading">
+            <TitleInfo :content="titleList[2]"></TitleInfo>
+            <!-- <div ref="echartDomTwo" style="height: 30vh"></div> -->
+            <div style="margin-top: 10px">
+              <byTable
+                :hideSearch="true"
+                :tableHeight="300"
+                :source="sourceList.salesmanSalesData"
+                :pagination="sourceList.salesmanSalesPagination"
+                :config="salesmanSalesConfig"
+                :loading="salesmanSalesLoading"
+                highlight-current-row
+                :selectConfig="[]"
+              >
+              </byTable>
+            </div>
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+
+    <div style="margin-top: 10px">
+      <el-row>
+        <el-col :span="12" class="bck" v-loading="productSalesLoading">
+          <TitleInfo :content="titleList[3]"></TitleInfo>
+          <div ref="echartDomThree" style="height: 30vh"></div>
+          <div style="margin-top: 10px">
+            <byTable
+              :hideSearch="true"
+              :tableHeight="300"
+              :source="sourceList.productSalesVolumeData"
+              :pagination="sourceList.productSalesVolumePagination"
+              :config="productSalesConfig"
+              :loading="productSalesLoading"
+              highlight-current-row
+              :selectConfig="[]"
+            >
+            </byTable>
+          </div>
+        </el-col>
+        <el-col :span="12" style="padding-left: 10px">
+          <div class="bck" v-loading="productSalesOneLoading">
+            <TitleInfo :content="titleList[4]"></TitleInfo>
+            <div ref="echartDomFour" style="height: 30vh"></div>
+            <div style="margin-top: 10px">
+              <byTable
+                :hideSearch="true"
+                :tableHeight="300"
+                :source="sourceList.productSalesVolumeOneData"
+                :pagination="sourceList.productSalesVolumeOnePagination"
+                :config="productSalesOneConfig"
+                :loading="productSalesOneLoading"
+                highlight-current-row
+                :selectConfig="[]"
+              >
+              </byTable>
+            </div>
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import * as echarts from "echarts";
+
+import byTable from "@/components/byTable/index";
+import TitleInfo from "@/components/TitleInfo/index.vue";
+const titleList = [
+  "销售分布",
+  "客户分类",
+  "业务员销售趋势",
+  "商品销售额",
+  "商品销量",
+];
+const { proxy } = getCurrentInstance();
+
+const statisticsLoading = ref(false);
+const scatterLoading = ref(false);
+const salesLoading = ref(false);
+const salesmanSalesLoading = ref(false);
+const productSalesLoading = ref(false);
+const productSalesOneLoading = ref(false);
+
+const queryForm = reactive({
+  beginTime: "",
+  endTime: "",
+  timeArr: "",
+});
+const sourceList = ref({
+  scatterData: [],
+  scatterPagination: {
+    total: 0,
+    pageNum: 1,
+    pageSize: 10,
+  },
+  salesData: [],
+  salesPagination: {
+    total: 0,
+    pageNum: 1,
+    pageSize: 10,
+  },
+  salesmanSalesData: [],
+  salesmanSalesPagination: {
+    total: 0,
+    pageNum: 1,
+    pageSize: 10,
+  },
+  productSalesVolumeData: [],
+  productSalesVolumePagination: {
+    total: 0,
+    pageNum: 1,
+    pageSize: 10,
+  },
+  productSalesVolumeOneData: [],
+  productSalesVolumeOnePagination: {
+    total: 0,
+    pageNum: 1,
+    pageSize: 10,
+  },
+});
+
+const allData = reactive({
+  salesStatisticsData: {},
+});
+//图表
+const echartDomOne = ref(null);
+const echartDomTwo = ref(null);
+const echartDomThree = ref(null);
+const echartDomFour = ref(null);
+let myChart = null;
+let myChartOne = null;
+let myChartTwo = null;
+let myChartThree = null;
+let myChartFour = null;
+const optionOne = reactive({
+  data: {
+    tooltip: {
+      trigger: "item",
+    },
+    legend: {
+      bottom: "0%",
+      left: "center",
+    },
+    series: [
+      {
+        name: '111',
+        type: 'pie',
+        radius: [20, 140],
+        center: ['50%', '50%'],
+        roseType: 'area',
+        itemStyle: {
+          borderRadius: 5
+        },
+        label: {
+          show: false,
+          position: "center",
+        },
+        emphasis: {
+          label: {
+            show: true,
+            fontSize: 20,
+            fontWeight: "bold",
+          },
+        },
+        labelLine: {
+          show: false,
+        },
+        data: [
+          { value: 1048, name: "中国" },
+          { value: 735, name: "美国" },
+          { value: 580, name: "韩国" },
+          { value: 484, name: "德国" },
+          { value: 300, name: "xxx" },
+        ],
+      },
+    ],
+  },
+});
+const optionTwo = reactive({
+  data:{
+    legend: {},
+    tooltip: {},
+    dataset: {
+      source: [
+        ['product', '订单量', '交易金额'],
+        ['Matcha Latte', 43.3, 85.8],
+        ['Milk Tea', 83.1, 73.4],
+        ['Cheese Cocoa', 86.4, 65.2],
+        ['Walnut Brownie', 72.4, 53.9]
+      ]
+    },
+    xAxis: { type: 'category' },
+    yAxis: {},
+    // Declare several bar series, each will be mapped
+    // to a column of dataset.source by default.
+    series: [{ type: 'bar' }, { type: 'bar' }]
+  }
+});
+const scatterConfig = computed(() => {
+  return [
+    {
+      type: "index",
+      attrs: {
+        label: "序列",
+        width: 80,
+        align: "center",
+      },
+    },
+    {
+      attrs: {
+        label: "国家",
+        prop: "countryName",
+      },
+    },
+    {
+      attrs: {
+        label: "订单量(单)",
+        prop: "count",
+      },
+    },
+    {
+      attrs: {
+        label: "交易金额(¥)",
+        prop: "amount",
+      },
+      render(amount) {
+        return proxy.moneyFormat(amount, 2);
+      },
+    },
+  ];
+});
+const salesConfig = computed(() => {
+  return [
+    {
+      type: "index",
+      attrs: {
+        label: "序列",
+        width: 80,
+        align: "center",
+      },
+    },
+    {
+      attrs: {
+        label: "客户",
+        prop: "corporationName",
+      },
+    },
+    {
+      attrs: {
+        label: "销售额(¥)",
+        prop: "amount",
+      },
+      render(amount) {
+        return proxy.moneyFormat(amount, 2);
+      },
+    },
+  ];
+});
+const salesmanSalesConfig = computed(() => {
+  return [
+    {
+      type: "index",
+      attrs: {
+        label: "序列",
+        width: 80,
+        align: "center",
+      },
+    },
+    {
+      attrs: {
+        label: "业务员",
+        prop: "userName",
+      },
+    },
+    {
+      attrs: {
+        label: "销售额(¥)",
+        prop: "amount",
+      },
+      render(amount) {
+        return proxy.moneyFormat(amount, 2);
+      },
+    },
+  ];
+});
+const productSalesConfig = computed(() => {
+  return [
+    {
+      type: "index",
+      attrs: {
+        label: "序列",
+        width: 80,
+        align: "center",
+      },
+    },
+    {
+      attrs: {
+        label: "商品名称",
+        prop: "productName",
+      },
+    },
+    {
+      attrs: {
+        label: "销售额(¥)",
+        prop: "amount",
+      },
+      render(amount) {
+        return proxy.moneyFormat(amount, 2);
+      },
+    },
+  ];
+});
+
+const productSalesOneConfig = computed(() => {
+  return [
+    {
+      type: "index",
+      attrs: {
+        label: "序列",
+        width: 80,
+        align: "center",
+      },
+    },
+    {
+      attrs: {
+        label: "商品名称",
+        prop: "productName",
+      },
+    },
+    {
+      attrs: {
+        label: "销售量(个)",
+        prop: "quantity",
+      },
+      render(quantity) {
+        return proxy.moneyFormat(quantity, 2);
+      },
+    },
+  ];
+});
+const getData = () => {
+  statisticsLoading.value = true;
+  scatterLoading.value = true;
+  salesLoading.value = true;
+  salesmanSalesLoading.value = true;
+  productSalesLoading.value = true;
+  productSalesOneLoading.value = true;
+  proxy.post("/contract/salesStatistics", queryForm).then((res) => {
+    allData.salesStatisticsData = res;
+    setTimeout(() => {
+      statisticsLoading.value = false;
+    }, 200);
+  });
+  proxy.post("/contract/countrySalesStatistics", queryForm).then((res) => {
+    sourceList.value.scatterData = res;
+    // optionOne.data.series[0].data = res.map((x) => ({
+    //   value: x.amount,
+    //   name: x.countryName,
+    // }));
+    myChartOne.setOption(optionOne.data);
+    setTimeout(() => {
+      scatterLoading.value = false;
+    }, 200);
+    myChartTwo.setOption(optionTwo.data);
+    setTimeout(() => {
+      salesmanSalesLoading.value = false;
+    }, 200);
+  });
+
+  // proxy.post("/contract/customSalesStatistics", queryForm).then((res) => {
+  //   sourceList.value.salesData = res;
+  //   const option = { ...optionTwo };
+  //   // option.data.xAxis[0].data = res.map((x) => x.corporationName);
+  //   // option.data.series[0].data = res.map((x) => x.amount);
+  //   // option.data.series[0].name = "销售额(¥)";
+    
+  // });
+
+  // proxy.post("/contract/salesmanSalesStatistics", queryForm).then((res) => {
+  //   sourceList.value.salesmanSalesData = res;
+  //   const option = { ...optionTwo };
+  //   option.data.xAxis[0].data = res.map((x) => x.userName);
+  //   option.data.series[0].data = res.map((x) => x.amount);
+  //   option.data.series[0].name = "销售额(¥)";
+  //   myChartTwo.setOption(option.data);
+  //   setTimeout(() => {
+  //     salesmanSalesLoading.value = false;
+  //   }, 200);
+  // });
+
+  // proxy.post("/contract/productSalesStatistics", queryForm).then((res) => {
+  //   sourceList.value.productSalesVolumeData = res;
+  //   const option = { ...optionTwo };
+  //   option.data.xAxis[0].data = res.map((x) => x.productName);
+  //   option.data.series[0].data = res.map((x) => x.amount);
+  //   option.data.series[0].name = "销售额(¥)";
+  //   myChartThree.setOption(option.data);
+  //   setTimeout(() => {
+  //     productSalesLoading.value = false;
+  //   }, 200);
+  // });
+
+  // proxy.post("/contract/salesVolumeStatistics", queryForm).then((res) => {
+  //   sourceList.value.productSalesVolumeOneData = res;
+  //   const option = { ...optionTwo };
+  //   option.data.xAxis[0].data = res.map((x) => x.productName);
+  //   option.data.series[0].data = res.map((x) => x.quantity);
+  //   option.data.series[0].name = "销售量(个)";
+  //   myChartFour.setOption(option.data);
+  //   setTimeout(() => {
+  //     productSalesOneLoading.value = false;
+  //   }, 200);
+  // });
+};
+
+const onQuery = () => {
+  if (queryForm.timeArr.length > 1) {
+    queryForm.beginTime = queryForm.timeArr[0];
+    queryForm.endTime = queryForm.timeArr[1];
+  } else {
+    queryForm.beginTime = "";
+    queryForm.endTime = "";
+  }
+  getData();
+};
+
+const onReset = () => {
+  queryForm.timeArr = [];
+  onQuery();
+};
+
+onMounted(() => {
+  // 客户分类柱状图
+  myChartOne = echarts.init(echartDomOne.value);
+  window.addEventListener("resize", () => {
+    myChartOne.resize();
+  });
+  // 业务员销售趋势柱状图
+  myChartTwo = echarts.init(echartDomTwo.value);
+  window.addEventListener("resize", () => {
+    myChartTwo.resize();
+  });
+  //商品销售额柱状图
+  myChartThree = echarts.init(echartDomThree.value);
+  window.addEventListener("resize", () => {
+    myChartThree.resize();
+  });
+  // 商品销量柱状图
+  myChartFour = echarts.init(echartDomFour.value);
+  window.addEventListener("resize", () => {
+    myChartFour.resize();
+  });
+  getData();
+});
+</script>
+
+<style lang="scss" scoped>
+.content {
+  margin: 20px;
+}
+:deep(.el-form-item) {
+  margin-bottom: 0px;
+}
+.bck {
+  background-color: #fff;
+  padding: 15px;
+}
+.statistics {
+  display: flex;
+  // justify-content: space-around;
+  .item {
+    border-radius: 10px;
+    margin-right: 20px;
+    width: 13vw;
+    height: 70px;
+    padding: 10px;
+    box-sizing: border-box;
+    display: flex;
+    justify-content: space-between;
+    .left_ {
+      display: flex;
+      flex-direction: column;
+      justify-content: space-around;
+      .money {
+        font-weight: 700;
+        color: #333333;
+        font-size: 15px;
+      }
+    }
+    .right_ {
+      .icon {
+        img {
+          width: 20px;
+          height: 20px;
+          margin-top: 6px;
+        }
+        width: 34px;
+        height: 34px;
+        margin-top: 10px;
+        border-radius: 8px;
+        background-color: #ffffff;
+        text-align: center;
+        line-height: 34px;
+      }
+    }
+  }
+  .first {
+    background: linear-gradient(#c7e3fe, #dfecff);
+  }
+  .two {
+    background: linear-gradient(#eae8fb, #ded9ff);
+  }
+  .three {
+    background: linear-gradient(#fcf1e4, #fce5ca);
+  }
+  .four {
+    background: linear-gradient(#e2fbe8, #e2fbe8);
+  }
+  .five {
+    background: linear-gradient(#ffebe9, #ffebe9);
+  }
+}
+// .scatter {
+//   display: flex;
+// }
+.public {
+  display: flex;
+}
+</style>

+ 184 - 41
src/views/dataBoard/board/salesAnalysis/index.vue

@@ -42,47 +42,32 @@
       style="margin-top: 10px"
       v-loading="statisticsLoading"
     >
-      <div class="item first">
-        <div class="left_">
-          <div class="money">
-            {{ moneyFormat(allData.salesStatisticsData.amount, 2) }}
-          </div>
-          <div>销售额(¥)</div>
-        </div>
-        <div class="right_">
-          <div class="icon">
-            <img src="@/assets/images/portrait/icon_sales.png" alt="" />
-          </div>
-        </div>
-      </div>
-      <div class="item two">
-        <div class="left_">
-          <div class="money">
-            {{ allData.salesStatisticsData.contractCount }}
-          </div>
-          <div>订单(单)</div>
-        </div>
-        <div class="right_">
-          <div class="icon">
-            <img src="@/assets/images/portrait/icon_profits.png" alt="" />
-          </div>
-        </div>
-      </div>
-      <div class="item three">
-        <div class="left_">
-          <div class="money">
-            {{ allData.salesStatisticsData.customerCount }}
-          </div>
-          <div>下单客户数(人)</div>
-        </div>
-        <div class="right_">
-          <div class="icon">
-            <img src="@/assets/images/portrait/icon_email.png" alt="" />
-          </div>
-        </div>
+      <div class="stat-warp">
+        <ul>
+          <li class="theme1">
+            <div class="num">{{ moneyFormat(allData.salesStatisticsData.amount, 2) }}</div>
+            <div class="label">销售额(¥)</div>
+            <div class="icon-box">
+              <i class="icon iconfont icon-iconx_caiwgl"></i>
+            </div>
+          </li>
+          <li class="theme2">
+            <div class="num">{{ allData.salesStatisticsData.contractCount }}</div>
+            <div class="label">订单(单)</div>
+            <div class="icon-box">
+              <i class="icon iconfont icon-iconm_fukgl"></i>
+            </div>
+          </li>
+          <li class="theme3">
+            <div class="num"> {{ allData.salesStatisticsData.customerCount }}</div>
+            <div class="label">下单客户数(人)</div>
+            <div class="icon-box">
+              <i class="icon iconfont icon-iconm_unread"></i>
+            </div>
+          </li>
+        </ul>
       </div>
     </div>
-
     <div
       class="bck scatter"
       style="margin-top: 10px"
@@ -96,19 +81,19 @@
         <el-col :span="16">
           <byTable
             :hideSearch="true"
-            :tableHeight="250"
+            :tableHeight="tableHeight"
             :source="sourceList.scatterData"
             :pagination="sourceList.scatterPagination"
             :config="scatterConfig"
             :loading="scatterLoading"
             highlight-current-row
+            :hidePagination="true"
             :selectConfig="[]"
           >
           </byTable>
         </el-col>
       </el-row>
     </div>
-
     <div style="margin-top: 10px">
       <el-row>
         <el-col :span="12" class="bck" v-loading="salesLoading">
@@ -467,6 +452,9 @@ const productSalesConfig = computed(() => {
     },
   ];
 });
+const tableHeight = computed(() => {
+  return document.documentElement.clientHeight / 10 * 4;
+});
 
 const productSalesOneConfig = computed(() => {
   return [
@@ -610,6 +598,12 @@ onMounted(() => {
   window.addEventListener("resize", () => {
     myChartFour.resize();
   });
+  
+  let endData = new Date();
+  let beginDate = new Date();
+  beginDate.setMonth(0);
+  beginDate.setDate(1);
+  queryForm.timeArr = [proxy.parseTime(beginDate, "{y}-{m}-{d}"), proxy.parseTime(endData, "{y}-{m}-{d}")];
   getData();
 });
 </script>
@@ -680,6 +674,155 @@ onMounted(() => {
     background: linear-gradient(#ffebe9, #ffebe9);
   }
 }
+.stat-warp {
+		background: #fff;
+		padding: 20px;
+		overflow: hidden;
+		position: relative;
+		border-radius: 5px;
+		
+		.title {
+			height: 60px;
+			select {
+				height: 60px;
+				border: none;
+				outline: none;
+				-webkit-appearance: none;
+				appearance: none;
+				font-size: 14px;
+				font-weight: bold;
+				background: url('@/assets/images/sanjiao.png') no-repeat right
+					center;
+				padding-right: 20px;
+			}
+			div {
+				height: 60px;
+				font-size: 14px;
+				font-weight: bold;
+				line-height: 60px;
+			}
+		}
+		ul {
+			padding: 0;
+			overflow: hidden;
+			margin: 0;
+			li {
+				list-style: none;
+				min-width: 285px;
+				box-sizing: border-box;
+				margin-right: 20px;
+				background: linear-gradient(360deg, #C7E3FE 0%, #DFECFF 100%);
+				float: left;
+				overflow: hidden;
+				padding: 20px;
+				color: #333333;
+				position: relative;
+				border-radius: 10px;
+				cursor: pointer;
+				.label {
+					font-size: 14px;
+					margin-top: 10px;
+				}
+				.label::before {
+					// width: 10px;
+					// height: 10px;
+					// content: '';
+					// border-radius: 50%;
+					// background: #0084ff;
+					// display: inline-block;
+					// margin-right: 10px;
+					
+				}
+				.num {
+					
+					font-size: 24px;
+					font-weight: bold;
+				}
+				.icon-box{
+					position: absolute;
+					height: 40px;
+					width: 40px;
+					right: 20px;
+					top: 20px;
+					background: #fff;
+					border-radius: 10px;
+					text-align: center;
+					line-height: 40px;
+					i{
+						font-size: 20px;
+						color:#0084FF;
+					}
+				}
+			}
+			//#F5F3FF #9E64ED
+			.theme2 {
+				background: linear-gradient(180deg, #EAE8FB 0%, #DED9FF 100%);
+				.label::before {
+					background: #7566F0;
+				}
+				.icon-box i {
+					color: #7566F0;
+				}
+			}
+			//#FFF1E1 #FF9315
+			.theme3 {
+				background: #fff1e1;
+				.label::before {
+					background: #ff9315;
+				}
+				.icon-box i {
+					color: #FF9315;
+				}
+			}
+			//#E2FBE8 #39C55A
+			.theme4 {
+				background: #e2fbe8;
+				.label::before {
+					background: #39c55a;
+				}
+			}
+			.theme5 {
+				background: #ffebe9;
+				.label::before {
+					background: #f94539;
+				}
+			}
+			.theme6 {
+				background: #e4f9f9;
+				.label::before {
+					background: #53cbcb;
+				}
+			}
+			.multi-data {
+				.label::before {
+					display: none;
+				}
+				.label {
+					font-size: 14px;
+					font-weight: bold;
+					color: #333;
+					margin-bottom: 8px;
+				}
+				.num-warp {
+					overflow: hidden;
+					.num-box {
+						float: left;
+						min-width: 80px;
+						margin-right: 20px;
+						.num-small {
+							font-size: 16px;
+							font-weight: bold;
+							margin-bottom: 8px;
+						}
+						.label-small {
+							color: #666;
+							font-size: 14px;
+						}
+					}
+				}
+			}
+		}
+	}
 // .scatter {
 //   display: flex;
 // }

+ 77 - 59
src/views/finance/fundManage/fundsStatement/index.vue

@@ -9,33 +9,35 @@
       </el-form-item>
       <el-form-item label="时间">
         <!-- 选单月 -->
-        <el-date-picker v-model="req.dateBetween" type="month" format="YYYY/MM" value-format="YYYY-MM" placeholder="选择日期"></el-date-picker>
+        <el-date-picker v-model="req.dateBetween" type="month" format="YYYY/MM" value-format="YYYY-MM"
+          placeholder="选择日期"></el-date-picker>
       </el-form-item>
       <el-form-item>
         <el-button type="primary" @click="getList">搜索</el-button>
       </el-form-item>
     </el-form>
-    <el-table :data="tableData" style="width: 100%" :span-method="objectSpanMethod">
+    <el-table :data="tableData" style="width: 100%" :span-method="objectSpanMethod" :height="tableHiehgt"
+      :cell-style="cellStyle">
       <el-table-column prop="accountManagementAlias" label="账户信息" width="400" fixed>
         <template #default="{ row }">
           <div class="account-box">
             <div class="text">
-              <div class="account">账户名称:{{ row.accountManagementAlias }}</div>
-              <div class="company">{{ row.corporationName }}</div>
+              <img src="@/assets/images/account-icon.png" alt="">
+              <div class="account">账户类型:{{ row.accountManagementAlias }}</div>
             </div>
-            <div class="img"></div>
+            <div class="corporation">{{ row.corporationName }}</div>
           </div>
         </template>
       </el-table-column>
-      <el-table-column prop="currencyType" label="币种" width="150" fixed>
+      <el-table-column prop="currencyType" label="币种" width="220" fixed>
         <template #default="{ row }">
-          {{ dictDataEcho(row.currencyType, dictsData.account_currency) }}
+          {{ dictDataEcho(row.currencyType, dictsData.account_currency) }}{{ row.currencyType }}({{ row.balanceTotal }})
         </template>
       </el-table-column>
-      <el-table-column :label="index + '日'" v-for="index of dayNum" :key="index">
-        <el-table-column :prop="index + 'income'" label="收入" />
-        <el-table-column :prop="index + 'expenditure'" label="支出" />
-        <el-table-column :prop="index + 'balance'" label="余额" />
+      <el-table-column :label="(dayNum - i + 1) + '日'" v-for="i of dayNum" :key="i">
+        <el-table-column :prop="(dayNum - i + 1) + 'income'" label="收入" width="120" />
+        <el-table-column :prop="(dayNum - i + 1) + 'expenditure'" label="支出" width="120" />
+        <el-table-column :prop="(dayNum - i + 1) + 'balance'" label="余额" width="120" />
       </el-table-column>
     </el-table>
   </div>
@@ -46,6 +48,8 @@ const { proxy } = getCurrentInstance();
 const loading = ref(false);
 let tableData = ref([]);
 const dayNum = ref(0);
+const tableHiehgt = ref(0);
+tableHiehgt.value = document.documentElement.clientHeight - 250;
 const objectSpanMethod = ({ rowIndex, columnIndex }) => {
   if (columnIndex === 0) {
     const _row = flitterData(tableData.value).one[rowIndex];
@@ -79,15 +83,27 @@ const flitterData = (arr) => {
   };
 };
 let req = ref({
-	dateBetween: formatDate(new Date(), 'yyyy-MM'),
-	managementId:null,
+  dateBetween: formatDate(new Date(), 'yyyy-MM'),
+  managementId: null,
 })
 let dictsData = {}
 proxy
-	.getDict(['account_currency'])
-	.then((res) => {
-		dictsData = res
-	})
+  .getDict(['account_currency'])
+  .then((res) => {
+    dictsData = res
+  })
+const cellStyle = ({ row, column, rowIndex, columnIndex }) => {
+  // 状态列字体颜色
+  // columnIndex 列下标
+  // rowIndex 行下标
+  // row 行
+  // column 列
+  if (columnIndex === 0) {
+    return { background: "#F9F9F9",color:'#666' };
+  } else if (columnIndex === 1) {
+    return { background: "#F9F9F9",color:'#666' };
+  }
+}
 
 const getList = async () => {
   loading.value = true;
@@ -113,12 +129,19 @@ const getList = async () => {
             obj[lelement.day + "balance"] = lelement.balance;
             obj[lelement.day + "income"] = lelement.income;
             obj[lelement.day + "expenditure"] = lelement.expenditure;
+            console.log(kelement.flowingWaterList.length + 'gggg' + l)
+            if (l === 0) {
+              console.log(kelement.flowingWaterList.length)
+              obj.balanceTotal = lelement.balance;
+            }
           }
           dayNum.value = kelement.flowingWaterList.length;
-          arr.push(obj);
+          //往前插入
+          arr.unshift(obj);
         }
       }
     }
+    console.log(arr);
     tableData.value = arr;
   });
 };
@@ -136,57 +159,52 @@ getAccountManagement();
   padding: 20px;
   margin: 20px;
   background: #fff;
+
   .account-box {
-    width: 360px;
-    height: 102px;
-    background: #eff6ff;
-    display: flex;
-    justify-content: space-between;
-    padding: 20px 10px 20px 33px;
-    margin: 20px 10px;
-    box-shadow: 0px 2px 10px 1px rgba(153, 153, 153, 0.1);
-    border-radius: 10px;
-    overflow: hidden;
-    position: relative;
-    .img {
-      width: 60px;
-      height: 60px;
-      background: url(../../../../assets/images/icon_zhangh1.png) no-repeat;
-    }
+    padding: 40px 20px;
+
     .text {
-      padding-top: 10px;
-      .account {
-        color: #333;
-        font-size: 20px;
-        font-weight: bold;
-      }
-      .company {
-        color: #999;
-        font-weight: 400;
-        font-size: 14px;
-        margin-top: 10px;
+      display: flex;
+      color: #333;
+      font-size: 14px;
+      font-weight: bold;
+      margin-bottom: 10px;
+
+      img {
+        width: 30px;
+        height: 22px;
+        background: linear-gradient(138deg, #1B67FF 0%, #9F63FB 72%, #EA76FB 100%);
+        border-radius: 5px;
+        opacity: 1;
+        margin-right: 10px;
       }
     }
   }
-  .account-box:before {
-    content: "";
-    width: 10px;
-    height: 102px;
-    background: #0084ff;
-    position: absolute;
-    left: 0;
-    top: 0;
-  }
+
   //修改tabletr边框颜色
   .is-group {
     tr {
-      .el-table_1_column_1 {
-        background: #eeeeee !important;
-      }
       th {
         border-color: #fff !important;
+        background: #eeeeee !important;
+      }
+
+
+    }
+
+    tr:first-child {
+
+      //选择第一个th
+      th:first-child {
+        background: #EFF6FF !important;
+      }
+
+      //选择第二个th
+      th:nth-child(2) {
+        background: #EFF6FF !important;
       }
     }
   }
-}
-</style>
+
+  .el-table__row {}
+}</style>

+ 14 - 1
src/views/index.vue

@@ -18,7 +18,7 @@
 					</div>
 				</li>
 				<li class="theme3">
-					<div class="num">3</div>
+					<div class="num">{{ pushInfo.total }}</div>
 					<div class="label">未读消息</div>
 					<div class="icon-box">
 						<i class="icon iconfont icon-iconm_unread"></i>
@@ -153,6 +153,10 @@ const pushProcessApproval = (row) => {
 	
 }
 const { proxy } = getCurrentInstance();
+const pushInfo = ref({
+	total:0,
+	rows:[]
+})
 const getData = (() => {
 	proxy.post('flowExample/getToBeProcessedPage',{
 		pageNum:1,
@@ -174,6 +178,15 @@ const getData = (() => {
 	}).then(res=>{
 		sendMegData.value = res
 	})
+	proxy.post('pushInfo/page',{
+		pageNum:1,
+		pageSize:3,
+		pushRead:0,
+		
+	}).then(res=>{
+		pushInfo.value = res
+	})
+	
 })
 const toUrl = (name,type) => {
 	//获取name为name的路由的基础信息

+ 5 - 5
src/views/process/dealWith/index.vue

@@ -51,7 +51,7 @@
 	</div>
 </template>
     
-  <script setup >
+  <script setup name="DealWith">
 /* eslint-disable vue/no-unused-components */
 import { ElMessage, ElMessageBox } from 'element-plus'
 import byTable from '@/components/byTable/index'
@@ -62,15 +62,15 @@ const submitLoading = ref(false)
 const dictCommonModal = ref(false)
 const sourceList = ref({
 	data: [],
-	pagination: {
+	pagination: { 
 		total: 3,
 		pageNum: 1,
 		pageSize: 10,
-        status:1,
+        status:2,
 	},
 })
 let dialogVisible = ref(false)
-let roomDialogVisible = ref(false)
+let roomDialogVisible = ref(false)                                                                        
 let modalType = ref('add')
 let rules = ref({
 	classifyName: [
@@ -346,7 +346,7 @@ const changeStatus = (row) => {
 }
 onMounted(() => {
 	const route = useRoute();
-	sourceList.value.pagination.status = route.query.type ? route.query.type : 1
+	sourceList.value.pagination.status = route.query.type ? route.query.type : '2'
 	getList()
 })
 

+ 281 - 103
src/views/process/processApproval/index.vue

@@ -3,45 +3,116 @@
     <div class="left-card">
       <div class="top">
         <div class="commons-title title">
-          {{ processConfig[route.query.flowKey] ?  
-            processConfig[route.query.flowKey].name + `(${processStaus[route.query.processType] || '发起'})` : "流程标题(发起)" 
+          {{
+            processConfig[route.query.flowKey]
+              ? processConfig[route.query.flowKey].name +
+                `(${processStaus[route.query.processType] || "发起"})`
+              : "流程标题(发起)"
           }}
         </div>
         <div class="line"></div>
-        <SendSubscribe ref="makeDom" @auxiliaryChange='(e) => getAuxiliaryData(e)' v-if="flowForm.flowKey == 'subscribe_flow'" :queryData="queryData.data"></SendSubscribe>
-        <SendPurchase ref="makeDom" @auxiliaryChange='(e) => getAuxiliaryData(e)' v-else-if="flowForm.flowKey == 'purchase_flow'" :queryData="queryData.data"></SendPurchase>
-        <SendFunds ref="makeDom" v-else-if="flowForm.flowKey == 'account_request_funds_flow'" :queryData="queryData.data"></SendFunds>
-        <ReturnGood ref="makeDom" v-else-if="flowForm.flowKey == 'sales_return_flow'" :queryData="queryData.data"></ReturnGood>
-        <PurchaseRefund ref="makeDom" v-else-if="flowForm.flowKey == 'refund_flow'" :queryData="queryData.data"></PurchaseRefund>
-        <PurchasePayment ref="makeDom"  @auxiliaryChange='(e) => getAuxiliaryData(e)' v-else-if="flowForm.flowKey == 'pay_flow'" :queryData="queryData.data"></PurchasePayment>
+        <SendSubscribe
+          ref="makeDom"
+          @auxiliaryChange="(e) => getAuxiliaryData(e)"
+          v-if="flowForm.flowKey == 'subscribe_flow'"
+          :queryData="queryData.data"
+        ></SendSubscribe>
+        <SendPurchase
+          ref="makeDom"
+          @auxiliaryChange="(e) => getAuxiliaryData(e)"
+          v-else-if="flowForm.flowKey == 'purchase_flow'"
+          :queryData="queryData.data"
+        ></SendPurchase>
+        <SendFunds
+          ref="makeDom"
+          v-else-if="flowForm.flowKey == 'account_request_funds_flow'"
+          :queryData="queryData.data"
+        ></SendFunds>
+        <ReturnGood
+          ref="makeDom"
+          v-else-if="flowForm.flowKey == 'sales_return_flow'"
+          :queryData="queryData.data"
+        ></ReturnGood>
+        <PurchaseRefund
+          ref="makeDom"
+          v-else-if="flowForm.flowKey == 'refund_flow'"
+          :queryData="queryData.data"
+        ></PurchaseRefund>
+        <PurchasePayment
+          ref="makeDom"
+          @auxiliaryChange="(e) => getAuxiliaryData(e)"
+          v-else-if="flowForm.flowKey == 'pay_flow'"
+          :queryData="queryData.data"
+        ></PurchasePayment>
         <template v-else-if="flowForm.flowKey == 'sale_quotation_flow'">
-          <PriceSheetEHSD ref="makeDom" v-if="flowForm.tenantType === 'EHSD'" :queryData="queryData.data"></PriceSheetEHSD>
-          <PriceSheet ref="makeDom" v-else :queryData="queryData.data"></PriceSheet>
+          <PriceSheetEHSD
+            ref="makeDom"
+            v-if="flowForm.tenantType === 'EHSD'"
+            :queryData="queryData.data"
+          ></PriceSheetEHSD>
+          <PriceSheet
+            ref="makeDom"
+            v-else
+            :queryData="queryData.data"
+          ></PriceSheet>
         </template>
         <template v-else-if="flowForm.flowKey == 'contract_flow'">
-          <ContractEHSD ref="makeDom" v-if="flowForm.tenantType === 'EHSD'" :queryData="queryData.data"></ContractEHSD>
-          <Contract ref="makeDom" v-else :queryData="queryData.data" @auxiliaryChange='(e) => getAuxiliaryData(e)'></Contract>
+          <ContractEHSD
+            ref="makeDom"
+            v-if="flowForm.tenantType === 'EHSD'"
+            :queryData="queryData.data"
+          ></ContractEHSD>
+          <Contract
+            ref="makeDom"
+            v-else
+            :queryData="queryData.data"
+            @auxiliaryChange="(e) => getAuxiliaryData(e)"
+          ></Contract>
         </template>
         <template v-else-if="flowForm.flowKey == 'contract_update_flow'">
-          <ContractAlteration ref="makeDom" :queryData="queryData.data" @auxiliaryChange='(e) => getAuxiliaryData(e)'></ContractAlteration>
+          <ContractAlteration
+            ref="makeDom"
+            :queryData="queryData.data"
+            @auxiliaryChange="(e) => getAuxiliaryData(e)"
+          ></ContractAlteration>
         </template>
         <template v-else-if="flowForm.flowKey == 'sample_flow'">
           <SampleEHSD ref="makeDom" :queryData="queryData.data"></SampleEHSD>
         </template>
         <template v-else-if="flowForm.flowKey == 'ehsd_purchase_flow'">
-          <PurchaseEHSD ref="makeDom" :queryData="queryData.data"></PurchaseEHSD>
+          <PurchaseEHSD
+            ref="makeDom"
+            :queryData="queryData.data"
+          ></PurchaseEHSD>
         </template>
 
-        <ServiceContract ref="makeDom" v-else-if="flowForm.flowKey == 'service_contract_flow'" :queryData="queryData.data"></ServiceContract>
+        <ServiceContract
+          ref="makeDom"
+          v-else-if="flowForm.flowKey == 'service_contract_flow'"
+          :queryData="queryData.data"
+        ></ServiceContract>
         <!-- 维多利亚 -->
-        <SendSubscribeWDLY ref="makeDom" v-else-if="flowForm.flowKey == 'wdly_apply_purchase'" :queryData="queryData.data"></SendSubscribeWDLY>
-        <SendPurchaseWDLY ref="makeDom" v-else-if="flowForm.flowKey == 'wdly_purchase'" :queryData="queryData.data"></SendPurchaseWDLY>
+        <SendSubscribeWDLY
+          ref="makeDom"
+          v-else-if="flowForm.flowKey == 'wdly_apply_purchase'"
+          :queryData="queryData.data"
+        ></SendSubscribeWDLY>
+        <SendPurchaseWDLY
+          ref="makeDom"
+          v-else-if="flowForm.flowKey == 'wdly_purchase'"
+          :queryData="queryData.data"
+        ></SendPurchaseWDLY>
       </div>
       <div class="bottom" v-if="route.query.processType != 20">
         <div class="commons-title title">处理意见</div>
         <el-form :model="flowForm" :rules="flowRules" ref="flowFormDom">
           <el-form-item prop="remark" label-width="0px" label="">
-            <el-input type="textarea" placeholder="请输入" v-model="flowForm.remark"> </el-input>
+            <el-input
+              type="textarea"
+              placeholder="请输入"
+              v-model="flowForm.remark"
+            >
+            </el-input>
           </el-form-item>
           <el-form-item prop="remark" label-width="80px" label="附件上传">
             <el-upload
@@ -51,13 +122,39 @@
               multiple
               :before-upload="uploadFile"
               :on-success="handleSuccess"
-              :on-preview="onPreviewFile">
+              :on-preview="onPreviewFile"
+            >
               <el-button>选择</el-button>
             </el-upload>
           </el-form-item>
           <el-form-item>
-            <el-button type="primary" v-if="approvalRecordData.buttonInfoList.length == 0" @click="handleSubmit" :loading="btnLoading">提交</el-button>
-            <el-button type="primary" v-else v-for="i in approvalRecordData.buttonInfoList" :key="i.type" :loading="btnLoading" @click="handleSubmit(i.type)">{{ i.name }}</el-button>
+            <el-button
+              type="primary"
+              v-if="approvalRecordData.buttonInfoList.length == 0"
+              @click="handleSubmit"
+              :loading="btnLoading"
+              >提交</el-button
+            >
+            <el-button
+              type="primary"
+              v-if="
+                approvalRecordData.buttonInfoList.length == 0 &&
+                StagFlowKey.includes(flowForm.flowKey)
+              "
+              @click="handleSubmitStag"
+              :loading="btnLoading"
+              >暂存</el-button
+            >
+
+            <el-button
+              type="primary"
+              v-else
+              v-for="i in approvalRecordData.buttonInfoList"
+              :key="i.type"
+              :loading="btnLoading"
+              @click="handleSubmit(i.type)"
+              >{{ i.name }}</el-button
+            >
           </el-form-item>
         </el-form>
       </div>
@@ -79,7 +176,8 @@
                   : item.status == 3 && route.query.id
                   ? 'flow-grey'
                   : ''
-              ">
+              "
+            >
               <div class="left-icon">
                 <i class="iconfont icon-iconm_daick"></i>
                 <i class="iconfont icon-icomx_quertj1 right-btm-status"></i>
@@ -88,11 +186,21 @@
                 <div class="name">{{ item.nodeName }}</div>
                 <div class="remark">
                   <div class="label">
-                    <span v-if="item.status != 3">办理人:</span>{{ item.processedUser }}<span class="time">{{ item.processedDate }}</span>
+                    <span v-if="item.status != 3">办理人:</span
+                    >{{ item.processedUser
+                    }}<span class="time">{{ item.processedDate }}</span>
                   </div>
                   {{ item.remark }}
-                  <div v-for="j in fileObj[item.flowExampleDetailId]" v-if="fileObj[item.flowExampleDetailId]">
-                    <a :href="j.fileUrl" style="color:#409EFF;line-height: 30px;">{{ j.fileName }}</a>
+                  <div
+                    v-for="j in fileObj[item.flowExampleDetailId]"
+                    v-if="fileObj[item.flowExampleDetailId]"
+                  >
+                    <!-- :href="j.fileUrl" -->
+                    <a
+                      @click="proxy.download(j.fileUrl, j.fileName)"
+                      style="color: #409eff; line-height: 30px"
+                      >{{ j.fileName }}</a
+                    >
                   </div>
                 </div>
               </div>
@@ -100,9 +208,13 @@
             </li>
           </ul>
         </el-tab-pane>
-        <el-tab-pane label="决策辅助" name="second" v-if="auxiliaryData.length > 0">
+        <el-tab-pane
+          label="决策辅助"
+          name="second"
+          v-if="auxiliaryData.length > 0"
+        >
           <div style="overflow: auto; height: calc(100vh - 200px)">
-          <auxiliary :data="auxiliaryData"></auxiliary>
+            <auxiliary :data="auxiliaryData"></auxiliary>
           </div>
         </el-tab-pane>
       </el-tabs>
@@ -111,8 +223,18 @@
     <el-dialog title="下一处理人" width="400" v-model="dialogVisible">
       <el-form :model="flowForm">
         <el-form-item prop="remark" label="处理人">
-          <el-select v-model="flowForm.handleUserId" placeholder="请选择" filterable style="width: 100%">
-            <el-option v-for="item in nextHandleUser" :label="item.name" :value="item.id"> </el-option>
+          <el-select
+            v-model="flowForm.handleUserId"
+            placeholder="请选择"
+            filterable
+            style="width: 100%"
+          >
+            <el-option
+              v-for="item in nextHandleUser"
+              :label="item.name"
+              :value="item.id"
+            >
+            </el-option>
           </el-select>
         </el-form-item>
         <el-form-item>
@@ -168,21 +290,22 @@ import SendSubscribeWDLY from "@/components/WDLY/process/SendSubscribeWDLY";
 //采购发起
 import SendPurchaseWDLY from "@/components/WDLY/process/SendPurchaseWDLY";
 import { ref } from "vue";
+const StagFlowKey = ref(["contract_flow", "sale_quotation_flow"]);
 const processConfig = ref({
-  subscribe_flow:{name:'申购'},
-  purchase_flow:{name:'采购'},
-  account_request_funds_flow:{name:'请款'},
-  sales_return_flow:{name:'退货'},
-  refund_flow:{name:'退款'},
-  pay_flow:{name:'付款'},
-  sale_quotation_flow:{name:'报价单'},
-  contract_flow:{name:'销售合同'},
-  contract_update_flow:{name:'销售合同变更'},
-  sample_flow:{name:'样品单'},
-  ehsd_purchase_flow:{name:'采购交接单'},
-  service_contract_flow:{name:'服务合同'},
-  wdly_apply_purchase:{name:'申购'},
-  wdly_purchase:{name:'采购'},
+  subscribe_flow: { name: "申购" },
+  purchase_flow: { name: "采购" },
+  account_request_funds_flow: { name: "请款" },
+  sales_return_flow: { name: "退货" },
+  refund_flow: { name: "退款" },
+  pay_flow: { name: "付款" },
+  sale_quotation_flow: { name: "报价单" },
+  contract_flow: { name: "销售合同" },
+  contract_update_flow: { name: "销售合同变更" },
+  sample_flow: { name: "样品单" },
+  ehsd_purchase_flow: { name: "采购交接单" },
+  service_contract_flow: { name: "服务合同" },
+  wdly_apply_purchase: { name: "申购" },
+  wdly_purchase: { name: "采购" },
 });
 
 const processStaus = ref({
@@ -195,11 +318,11 @@ const route = useRoute();
 // tab切换逻辑
 const activeName = ref("first");
 let auxiliaryData = ref([]);
-const getAuxiliaryData = (data)=>{
-  auxiliaryData.value=data
-}
+const getAuxiliaryData = (data) => {
+  auxiliaryData.value = data;
+};
 
-const btnLoading = ref(false)
+const btnLoading = ref(false);
 // 意见表单
 const flowForm = reactive({
   flowKey: "",
@@ -207,7 +330,7 @@ const flowForm = reactive({
   handleUserId: "",
   remark: "",
   data: {},
-  fileList:[],
+  fileList: [],
 });
 
 const uploadData = ref({});
@@ -238,7 +361,6 @@ const handleResult = (res) => {
   }
 };
 
-
 const uploadFile = async (file) => {
   const res = await proxy.post("/fileInfo/getSing", { fileName: file.name });
   uploadData.value = res.uploadBody;
@@ -262,9 +384,9 @@ const handleSubmit = async (_type) => {
     const flag = await makeDom.value.handleSubmit();
     if (flag) {
       flowFormDom.value.validate((valid) => {
-        btnLoading.value  = true
+        btnLoading.value = true;
         if (valid) {
-          const data = {...makeDom.value.getFormData()};
+          const data = { ...makeDom.value.getFormData() };
           if (flowForm.flowKey == "subscribe_flow") {
             // data.subscribeDetailList = data.subscribeDetailList.map((x) => ({
             //   bussinessId: x.bussinessId,
@@ -314,16 +436,18 @@ const handleSubmit = async (_type) => {
               data.ehsdJson = JSON.stringify({
                 deliveryTime: data.deliveryTime,
               });
-              data.quotationProductList = data.quotationProductList.map((item) => {
-                let ehsdJson = JSON.stringify({
-                  packMethod: item.packMethod,
-                  tradeMethods: item.tradeMethods,
-                });
-                return {
-                  ...item,
-                  ehsdJson: ehsdJson,
-                };
-              });
+              data.quotationProductList = data.quotationProductList.map(
+                (item) => {
+                  let ehsdJson = JSON.stringify({
+                    packMethod: item.packMethod,
+                    tradeMethods: item.tradeMethods,
+                  });
+                  return {
+                    ...item,
+                    ehsdJson: ehsdJson,
+                  };
+                }
+              );
             }
           } else if (flowForm.flowKey == "contract_flow") {
             if (flowForm.tenantType === "EHSD") {
@@ -352,16 +476,18 @@ const handleSubmit = async (_type) => {
               data.ehsdJson = JSON.stringify({
                 deliveryTime: data.deliveryTime,
               });
-              data.contractProductList = data.contractProductList.map((item) => {
-                let ehsdJson = JSON.stringify({
-                  packMethod: item.packMethod,
-                  tradeMethods: item.tradeMethods,
-                });
-                return {
-                  ...item,
-                  ehsdJson: ehsdJson,
-                };
-              });
+              data.contractProductList = data.contractProductList.map(
+                (item) => {
+                  let ehsdJson = JSON.stringify({
+                    packMethod: item.packMethod,
+                    tradeMethods: item.tradeMethods,
+                  });
+                  return {
+                    ...item,
+                    ehsdJson: ehsdJson,
+                  };
+                }
+              );
             }
           } else if (flowForm.flowKey == "sample_flow") {
             if (data.fileList && data.fileList.length > 0) {
@@ -403,7 +529,7 @@ const handleSubmit = async (_type) => {
           flowForm.fileList = flowForm.fileList.map((item) => {
             return {
               ...item,
-              ...item.raw
+              ...item.raw,
             };
           });
           if (route.query.processType == 10 || route.query.processType == 30) {
@@ -423,11 +549,14 @@ const handleSubmit = async (_type) => {
                 version: route.query.version,
                 flowId: route.query.id,
               })
-              .then((res) => {
-                handleResult(res);
-              },err=>{
-                 btnLoading.value  = false
-              });
+              .then(
+                (res) => {
+                  handleResult(res);
+                },
+                (err) => {
+                  btnLoading.value = false;
+                }
+              );
             return;
           } else {
             proxy
@@ -435,11 +564,57 @@ const handleSubmit = async (_type) => {
                 ...flowForm,
                 data,
               })
-              .then((res) => {
-                handleResult(res);
-              },err=>{
-                 btnLoading.value  = false
-              });
+              .then(
+                (res) => {
+                  handleResult(res);
+                },
+                (err) => {
+                  btnLoading.value = false;
+                }
+              );
+          }
+        }
+      });
+    }
+  } catch (err) {
+    console.log("数据未填完整!", err);
+  }
+};
+// 暂存
+const handleSubmitStag = async (_type) => {
+  try {
+    // 调用发起组件的提交事件
+    const flag = await makeDom.value.handleSubmit(true);
+    if (flag) {
+      flowFormDom.value.validate((valid) => {
+        btnLoading.value = true;
+        if (valid) {
+          const data = { ...makeDom.value.getFormData() };
+          data.dataJson = JSON.stringify(proxy.deepClone(data));
+          flowForm.fileList = flowForm.fileList.map((item) => {
+            return {
+              ...item,
+              ...item.raw,
+            };
+          });
+          if (flowForm.flowKey == "sale_quotation_flow") {
+            proxy.post("/saleQuotation/add", data).then(
+              (res) => {
+                skipPage();
+              },
+              (err) => {
+                btnLoading.value = false;
+              }
+            );
+          } else if (flowForm.flowKey == "contract_flow") {
+            proxy.post("/contract/add", data).then(
+              (res) => {
+                skipPage();
+              },
+              (err) => {
+                btnLoading.value = false;
+              }
+            );
           }
         }
       });
@@ -456,8 +631,6 @@ const skipPage = () => {
     router.replace({
       path: "/oa/1/dealWith",
     });
-    
-    
   } else {
     ElMessage({
       message: "操作成功!",
@@ -540,7 +713,7 @@ let queryData = reactive({
 // 记录
 const recordList = ref([]);
 const fileIds = ref([]);
-const fileObj = ref({}); 
+const fileObj = ref({});
 const approvalRecordData = ref({
   buttonInfoList: [],
 });
@@ -557,11 +730,13 @@ const getRecords = (_id) => {
         fileIds.value = res.recordList.map((item) => {
           return item.flowExampleDetailId;
         });
-        proxy.post('fileInfo/getList',{businessIdList:fileIds.value}).then(res2=>{
-          console.log(res2)
-          fileObj.value = res2
-        })  
-        console.log(fileObj.value)
+        proxy
+          .post("fileInfo/getList", { businessIdList: fileIds.value })
+          .then((res2) => {
+            console.log(res2);
+            fileObj.value = res2;
+          });
+        console.log(fileObj.value);
       });
   } else {
     proxy
@@ -575,10 +750,16 @@ const getRecords = (_id) => {
 };
 onMounted(async () => {
   //processType 10 为修改 20为查看 30回退发起
-  if (route.query.processType == 10 || route.query.processType == 20 || route.query.processType == 30) {
-    await proxy.post("/flowProcess/getStartData", { flowId: route.query.id }).then((res) => {
-      queryData.data = { ...res };
-    });
+  if (
+    route.query.processType == 10 ||
+    route.query.processType == 20 ||
+    route.query.processType == 30
+  ) {
+    await proxy
+      .post("/flowProcess/getStartData", { flowId: route.query.id })
+      .then((res) => {
+        queryData.data = { ...res };
+      });
   } else {
     queryData.data = { ...route.query };
   }
@@ -588,22 +769,19 @@ onMounted(async () => {
 });
 </script>
 <style>
-.el-upload-list{
+.el-upload-list {
   float: left;
-  margin: 0!important;
-  
+  margin: 0 !important;
 }
-.el-upload-list li{
-  width:100px;
+.el-upload-list li {
+  width: 100px;
   margin-left: 10px;
 }
-.el-upload--text{
+.el-upload--text {
   float: left;
 }
-
 </style>
 <style lang="scss" scoped>
-
 .processApproval {
   display: flex;
   justify-content: space-between;
@@ -624,7 +802,7 @@ onMounted(async () => {
       overflow-y: auto;
       background: #fff;
       padding: 20px 20px 0px 20px;
-      .line{
+      .line {
         border-bottom: 1px solid #ddd;
         margin-bottom: 20px;
       }

+ 1 - 1
src/views/process/processConfig/processChart.vue

@@ -14,7 +14,7 @@
 		<div class="content">
 			<div class="commons-title">流程节点配置</div>
 			<div class="chart-warp">
-				<vueFlow :title='title'></vueFlow>
+				<vueFlow :title='title' @changeTitle="e => title = e"></vueFlow>
 			</div>
 		</div>
 	</div>

+ 21 - 30
src/views/process/processConfig/vueFlow.vue

@@ -436,8 +436,8 @@ const deleteFlowDefinitionNodeObj = (id) => {
 	dialogVisible.value = false
 }
 
-const gethandleObjectList = (e) => {
-	formData.data.handleObjectId = ''
+const gethandleObjectList = (e,data) => {
+	
 	if (e === 1) {
 		proxy
 			.get(
@@ -452,7 +452,12 @@ const gethandleObjectList = (e) => {
 						value: item.userId,
 					}
 				})
+				formData.data = {
+					...data,
+				}
+				if(!data) formData.data.handleObjectId = ''
 			})
+		
 	}
 	if (e === 3 || e === 2) {
 		proxy
@@ -468,6 +473,10 @@ const gethandleObjectList = (e) => {
 						value: item.deptId,
 					}
 				})
+				formData.data = {
+					...data,
+				}
+				if(!data) formData.data.handleObjectId = ''
 			})
 	}
 	if (e === 4) {
@@ -486,6 +495,10 @@ const gethandleObjectList = (e) => {
 						value: item.roleId,
 					}
 				})
+				formData.data = {
+					...data,
+				}
+				if(!data) formData.data.handleObjectId = ''
 			})
 	}
 }
@@ -682,6 +695,7 @@ const antvInit = (data) => {
 		if (flowDefinitionNodeObj.value[cell.id]) {
 			formData.data = flowDefinitionNodeObj.value[cell.id]
 			formData.data.cell = cell
+			gethandleObjectList(flowDefinitionNodeObj.value[cell.id].handleObjectType,flowDefinitionNodeObj.value[cell.id])
 		} else {
 			formData.data = {
 				id: cell.id,
@@ -689,7 +703,7 @@ const antvInit = (data) => {
 				nodeButtonSet: [1],
 			}
 		}
-
+		
 		dialogVisible.value = true
 	})
 	// #region 初始化图形
@@ -902,8 +916,10 @@ const antvInit = (data) => {
 	
 	
 }
+const emit = defineEmits(["changeTitle"]);
 const getFlowInfo =	(()=>{
 	proxy.post('/flowDefinition/getDetails', {id:submitFormData.id}).then((res) => {
+		emit("changeTitle", res.titleTemplate);
 		if(res.lineObject) {
 			flowDefinitionNodeObj.value = JSON.parse(res.lineObject)
 			for (const key in flowDefinitionNodeObj.value) {
@@ -921,7 +937,7 @@ const getFlowInfo =	(()=>{
 		}
 		for (const key in flowDefinitionNodeObj.value) {
 			//延迟等待dom渲染完成
-			setTimeout(() => {
+			setTimeout(() => { 
 				if(flowDefinitionNodeObj.value[key].nodeName != '结束' && flowDefinitionNodeObj.value[key].cell != '开始'){
 					let htmlNode = document.querySelector("g[data-cell-id='"+ key +"']")
 					//获取htmlNode节点下的title,修改title的内容
@@ -951,32 +967,7 @@ onMounted(() => {
 	submitFormData.tenantId = router.currentRoute.value.query.tenantId
 	if(submitFormData.flowInfoId) {
 		getFlowInfo()
-		// antvInit()
-		// setTimeout(() => {
-		// 	for (let i = 0; i < dataJson.flowDefinitionNodeList.length; i++) {
-		// 		const element = dataJson.flowDefinitionNodeList[i];
-		// 		console.log(element)
-		// 		if(!element.cell) {
-		// 			continue
-		// 		}
-		// 		if( element.cell.nodeName != '开始' && element.cell.nodeName != '结束'){
-		// 			flowDefinitionNodeObj.value[element.cell.id] = element
-		// 			flowDefinitionNodeObj.value[element.cell.id].nodeButtonSet = element.nodeButtonSet.split(',')
-		// 			graph.addNode({
-		// 				shape: 'handle-btn',
-		// 				x: element.cell.position.x,
-		// 				y: element.cell.position.y,
-		// 				label: '办理',
-		// 				id:element.cell.id,
-		// 				attrs: {
-							
-		// 				},
-		// 			})
-		// 		}
-				
-		// 	}
-		// 	console.log(flowDefinitionNodeObj.value)
-		// }, 1000);
+		
 	}
 	setTimeout(() => {
 		if(window.document.getElementById('minimap').children.length > 1) {

+ 40 - 41
src/views/purchaseManage/purchasePayment/payment/index.vue

@@ -13,7 +13,8 @@
           action: () => purchasePayment(),
         },
       ]"
-      @get-list="getList">
+      @get-list="getList"
+    >
       <template #amount="{ item }">
         <div>
           <span>{{ moneyFormat(item.amount, 2) }}</span>
@@ -25,7 +26,9 @@
       <PaymentPDF :rowData="rowData"></PaymentPDF>
       <template #footer>
         <el-button @click="openPrint = false" size="large">取消</el-button>
-        <el-button type="primary" @click="clickDownload()" size="large">下载PDF</el-button>
+        <el-button type="primary" @click="clickDownload()" size="large"
+          >下载PDF</el-button
+        >
       </template>
     </el-dialog>
   </div>
@@ -39,6 +42,7 @@ import PaymentPDF from "@/components/PDF/paymentPDF.vue";
 
 const { proxy } = getCurrentInstance();
 const payStatus = ref([]);
+const payMethod = ref([]);
 const fundsPaymentMethod = ref([]);
 const accountList = ref([]);
 const userList = ref([]);
@@ -114,6 +118,16 @@ const config = computed(() => {
     },
     {
       attrs: {
+        label: "付款类型",
+        prop: "type",
+        width: 100,
+      },
+      render(type) {
+        return proxy.dictValueLabel(type, payMethod.value);
+      },
+    },
+    {
+      attrs: {
         label: "付款方式",
         prop: "payType",
         width: 160,
@@ -195,48 +209,16 @@ const config = computed(() => {
 });
 const getDict = () => {
   proxy
-    .post("/dictTenantData/page", {
-      pageNum: 1,
-      pageSize: 999,
-      dictCode: "pay_status",
-      tenantId: useUserStore().user.tenantId,
-    })
+    .post("/accountManagement/page", { pageNum: 1, pageSize: 999 })
     .then((res) => {
-      if (res.rows && res.rows.length > 0) {
-        payStatus.value = res.rows.map((item) => {
-          return {
-            label: item.dictValue,
-            value: item.dictKey,
-          };
-        });
-      }
+      accountList.value = res.rows.map((item) => {
+        return {
+          label: item.alias,
+          value: item.id,
+        };
+      });
     });
   proxy
-    .post("/dictTenantData/page", {
-      pageNum: 1,
-      pageSize: 999,
-      dictCode: "funds_payment_method",
-      tenantId: useUserStore().user.tenantId,
-    })
-    .then((res) => {
-      if (res.rows && res.rows.length > 0) {
-        fundsPaymentMethod.value = res.rows.map((item) => {
-          return {
-            label: item.dictValue,
-            value: item.dictKey,
-          };
-        });
-      }
-    });
-  proxy.post("/accountManagement/page", { pageNum: 1, pageSize: 999 }).then((res) => {
-    accountList.value = res.rows.map((item) => {
-      return {
-        label: item.alias,
-        value: item.id,
-      };
-    });
-  });
-  proxy
     .get("/tenantUser/list", {
       pageNum: 1,
       pageSize: 10000,
@@ -253,6 +235,23 @@ const getDict = () => {
         });
       }
     });
+
+  proxy
+    .getDictOne(["funds_payment_method", "pay_method", "pay_status"])
+    .then((res) => {
+      fundsPaymentMethod.value = res["funds_payment_method"].map((x) => ({
+        label: x.dictValue,
+        value: x.dictKey,
+      }));
+      payMethod.value = res["pay_method"].map((x) => ({
+        label: x.dictValue,
+        value: x.dictKey,
+      }));
+      payStatus.value = res["pay_status"].map((x) => ({
+        label: x.dictValue,
+        value: x.dictKey,
+      }));
+    });
 };
 const getList = async (req) => {
   sourceList.value.pagination = { ...sourceList.value.pagination, ...req };

+ 74 - 36
src/views/salesMange/saleContract/contract/index.vue

@@ -28,58 +28,74 @@
         <template #amount="{ item }">
           <div>
             <span style="padding-right: 4px">{{ item.currency }}</span>
-            <span>{{ moneyFormat(item.amount, 2) }}</span>
+            <span>{{ moneyFormat(item.amount, 4) }}</span>
           </div>
         </template>
         <template #amountCNY="{ item }">
           <div>
-            <span>{{ moneyFormat(item.amountCNY, 2) }}</span>
+            <span>{{ moneyFormat(item.amountCNY, 4) }}</span>
           </div>
         </template>
         <template #sumClaimMoney="{ item }">
           <div>
-            <el-popover :width="400" trigger="hover" @show="recordShow(item)">
+            <el-popover :width="520" trigger="hover">
               <template #reference>
                 <a
                   style="color: #409eff; cursor: pointer; word-break: break-all"
-                  >{{ moneyFormat(item.sumClaimMoney, 2) }}</a
+                  >{{ moneyFormat(item.sumClaimMoney, 4) }}</a
                 >
               </template>
               <template #default>
                 <div
-                  style="
-                    width: 100%;
-                    max-height: 60vh;
-                    overflow-y: auto;
-                    overflow-x: hidden;
+                  style="width: 100%; padding: 10px"
+                  v-if="
+                    item.claimContractList && item.claimContractList.length > 0
                   "
-                  v-if="item.claimRecord && item.claimRecord.length > 0"
                 >
                   <div
-                    v-for="(record, index) in item.claimRecord"
+                    v-for="(record, index) in item.claimContractList"
                     :key="index"
-                    style="margin-bottom: 20px"
+                    style="background: #f1f1f1; border-radius: 2px"
+                    :style="{
+                      'margin-bottom':
+                        index !== item.claimContractList.length - 1
+                          ? '20px'
+                          : '0px',
+                    }"
+                    :class="{ 'act-class': record.id === currentId }"
+                    @mouseenter="handleMoveEnter(record)"
                   >
-                    <div style="display: flex; justify-content: space-between">
-                      <span style="color: #909399">{{
-                        record.createTime
-                      }}</span>
-                      <span style="color: #909399">{{
-                        dictValueLabel(record.createUser, userList)
-                      }}</span>
-                    </div>
                     <div
                       style="
                         display: flex;
-                        justify-content: space-between;
-                        padding: 8px 0;
+                        justify-content: space-around;
+                        padding: 5px 0;
                       "
                     >
-                      <span
-                        >认领金额: {{ record.currency }}
-                        {{ record.money }}</span
-                      >
-                      <span>汇率: {{ record.rate }}</span>
+                      <div style="color: #333333">
+                        <div style="color: #999999; margin-bottom: 4px">
+                          认领金额:
+                        </div>
+                        {{ record.currency }} {{ record.money }}
+                      </div>
+                      <div style="color: #333333">
+                        <div style="color: #999999; margin-bottom: 4px">
+                          汇率:
+                        </div>
+                        {{ record.rate }}
+                      </div>
+                      <div style="color: #333333">
+                        <div style="color: #999999; margin-bottom: 4px">
+                          时间:
+                        </div>
+                        {{ record.createTime }}
+                      </div>
+                      <div style="color: #333333">
+                        <div style="color: #999999; margin-bottom: 4px">
+                          认领人:
+                        </div>
+                        {{ dictValueLabel(record.createUser, userList) }}
+                      </div>
                     </div>
                   </div>
                 </div>
@@ -345,6 +361,19 @@ const config = computed(() => {
       },
       renderHTML(row) {
         return [
+          row.status == 0
+            ? {
+                attrs: {
+                  label: "修改",
+                  type: "primary",
+                  text: true,
+                },
+                el: "button",
+                click() {
+                  clickUpdate(row);
+                },
+              }
+            : {},
           !row.refundStatus && row.refundStatusNew == 10
             ? {
                 attrs: {
@@ -551,7 +580,7 @@ const newContract = () => {
     path: "/platform_manage/process/processApproval",
     query: {
       flowKey: "contract_flow",
-      flowName: "销售合同审批流程",
+      flowName: "销售合同流程发起",
       random: proxy.random(),
     },
   });
@@ -657,6 +686,17 @@ const clickAlteration = (row) => {
     },
   });
 };
+const clickUpdate = (row) => {
+  proxy.$router.replace({
+    path: "/platform_manage/process/processApproval",
+    query: {
+      flowKey: "contract_flow",
+      flowName: "销售合同流程发起",
+      contractId: row.id,
+      random: proxy.random(),
+    },
+  });
+};
 
 const getStyle = (status) => {
   if (status == 10) {
@@ -683,14 +723,9 @@ const handleClickName = (row) => {
     },
   });
 };
-const recordShow = (item) => {
-  if (!(item.claimRecord && item.claimRecord.length > 0)) {
-    proxy.post("/claimContract/getListByContractIds", [item.id]).then((res) => {
-      if (res && res.length > 0) {
-        item.claimRecord = res;
-      }
-    });
-  }
+const currentId = ref("");
+const handleMoveEnter = (item) => {
+  currentId.value = item.id;
 };
 </script>
 
@@ -711,4 +746,7 @@ const recordShow = (item) => {
   line-height: 24px;
   padding-left: 4px;
 }
+.act-class {
+  background: #eff6ff !important;
+}
 </style>

+ 25 - 0
src/views/salesMange/saleContract/priceSheet/index.vue

@@ -547,6 +547,19 @@ const config = computed(() => {
       },
       renderHTML(row) {
         return [
+          row.status == 0
+            ? {
+                attrs: {
+                  label: "修改",
+                  type: "primary",
+                  text: true,
+                },
+                el: "button",
+                click() {
+                  clickUpdate(row);
+                },
+              }
+            : {},
           {
             attrs: {
               label: "复制",
@@ -810,6 +823,18 @@ const getStyle = (status) => {
     return {};
   }
 };
+
+const clickUpdate = (row) => {
+  proxy.$router.replace({
+    path: "/platform_manage/process/processApproval",
+    query: {
+      flowKey: "sale_quotation_flow",
+      flowName: "报价审批流程",
+      priceSheetIdOne: row.id,
+      random: proxy.random(),
+    },
+  });
+};
 </script>
 
 <style lang="scss" scoped>

+ 15 - 11
src/views/salesMange/salesMange/afterSales/index.vue

@@ -58,9 +58,9 @@
       >
         <template #details>
           <div style="width: 100%">
-            <!-- <el-button type="primary" plain @click="openProduct = true">
+            <el-button type="primary" plain @click="openProduct = true">
               添加商品
-            </el-button> -->
+            </el-button>
             <el-table
               :data="formData.data.afterSalesDetailList"
               style="margin-top: 10px"
@@ -266,9 +266,9 @@ const rules = ref({
   customerId: [
     { required: true, message: "请选择客户名称", trigger: "change" },
   ],
-  contractIds: [
-    { required: true, message: "请选择销售合同", trigger: "change" },
-  ],
+  // contractIds: [
+  //   { required: true, message: "请选择销售合同", trigger: "change" },
+  // ],
   type: [{ required: true, message: "请选择售后类型", trigger: "change" }],
   remark: [{ required: true, message: "请输入售后说明", trigger: "blur" }],
   quantity: [{ required: true, message: "请输入售后数量", trigger: "blur" }],
@@ -523,7 +523,9 @@ const config = computed(() => {
 });
 
 const formData = reactive({
-  data: {},
+  data: {
+    afterSalesDetailList: [],
+  },
   followData: {},
 });
 const formOption = reactive({
@@ -589,12 +591,13 @@ const formConfig = computed(() => {
         width: "50%",
       },
     },
-    {
-      type: "title",
-      title: "产品明细",
-    },
+    // {
+    //   type: "title",
+    //   title: "产品明细",
+    // },
     {
       type: "slot",
+      label: "产品明细",
       slotName: "details",
     },
   ];
@@ -810,6 +813,7 @@ const clickAdd = (type) => {
   contractList.value = [];
   formData.data = {
     contractIds: [],
+    afterSalesDetailList: [],
   };
   dialogVisible.value = true;
 };
@@ -839,7 +843,7 @@ const pushGoods = (goods) => {
     ) {
       afterFiltering = goods.filter((item) => {
         let data = formData.data.afterSalesDetailList.filter(
-          (itemProduct) => itemProduct.bussinessId === item.id
+          (itemProduct) => itemProduct.productId === item.id
         );
         if (data && data.length > 0) {
           return false;

+ 7 - 0
vite.config.js

@@ -44,6 +44,13 @@ export default defineConfig(({
           // target:"http://139.159.251.109/prod-api",
           changeOrigin: true,
           rewrite: (p) => p.replace(/^\/dev-api/, '')
+        },
+        '/byteSailing': {
+          target: 'https://os.winfaster.cn/byteSailing',
+          // 正式地址
+          // target:"http://139.159.251.109/prod-api",
+          changeOrigin: true,
+          rewrite: (p) => p.replace(/^\/byteSailing/, '')
         }
       }
     },

部分文件因为文件数量过多而无法显示