Преглед изворни кода

手机端适配、以及部分费控bug更改

cz пре 11 месеци
родитељ
комит
1eb3a1618d

+ 3 - 0
.env.development

@@ -13,6 +13,9 @@ VITE_APP_IP = '139.9.102.170'
 # WS
 VITE_APP_WS_API = ':20010/test-api'
 
+# PORT
+VITE_APP_PORT = ':20010'
+
 #上传文件地址
 VITE_APP_UPLOAD_API='139.9.102.170:20010'
 VITE_APP_UPLOAD_BASE_API = '/test-api'

+ 3 - 0
.env.production

@@ -13,6 +13,9 @@ VITE_APP_IP = '175.178.26.5'
 # WS
 VITE_APP_WS_API = '/prod-api'
 
+# PORT
+VITE_APP_PORT = ':80'
+
 #上传文件地址
 VITE_APP_UPLOAD_API='175.178.26.5'
 VITE_APP_UPLOAD_BASE_API = '/prod-api'

+ 3 - 0
.env.staging

@@ -13,6 +13,9 @@ VITE_APP_IP = '139.9.102.170'
 # WS
 VITE_APP_WS_API = ':20010/test-api'
 
+# PORT
+VITE_APP_PORT = ':20010'
+
 #上传文件地址
 VITE_APP_UPLOAD_API='139.9.102.170:20010'
 VITE_APP_UPLOAD_BASE_API = '/test-api'

BIN
public/img/anzhuo.png


BIN
public/img/app.png


BIN
public/img/jiantou.png


BIN
src/assets/images/wx-page.png


+ 195 - 16
src/components/headerBar/downloadApp.vue

@@ -1,8 +1,33 @@
 <template>
-  <div class="pageIndexClass">
-    <div v-if="isWeiXin">
-      <div class="box">
-        请点击右上角用浏览器打开
+  <div>
+    <!-- v-if="isWeiXin" -->
+    <div style="height:100vh;background:#FFF">
+      <div class="bk-img">
+        <!-- <div class="dec">
+          <div class="text" style="transform:translateY(15px)">
+            点击右上角选择浏览器打开
+          </div>
+          <img :src="'/img/jiantou.png'" alt="" style="width:32px;height:32px;vertical-align:middle;object-fit:contain;">
+        </div> -->
+      </div>
+      <div class="pageIndexClass">
+        <div style="text-align:center">
+          <div style="color:#1b374c;font-size:0.7rem;margin-top:0.6rem;font-weight:700">
+            SANFAN MES制造执行系统
+          </div>
+          <div style="margin-top:1.25rem">
+            <img :src="'/img/app.png'" style="width:2.75rem;height:2.75rem;vertical-align:middle;object-fit:contain;border-radius:10px" />
+          </div>
+          <span class="btn" @click="handleDownloadApp">
+            <img :src="'/img/anzhuo.png'" alt=""
+                 style="width:0.8rem;height:0.8rem;vertical-align:bottom;object-fit:contain;transform:translateY(-0.4rem)">
+            <!-- :class="{'wx':isWeiXin,'nowx':!isWeiXin}" -->
+            <span style="font-size:0.6rem;margin-left:10px;display: inline-block;">
+              <!-- :class="{'textwx':isWeiXin,'textnowx':!isWeiXin}" -->
+              Android版本下载
+            </span>
+          </span>
+        </div>
       </div>
     </div>
   </div>
@@ -15,23 +40,177 @@ onMounted(() => {
   if (ua.match(/MicroMessenger/i) == "micromessenger") {
     isWeiXin.value = true;
   } else {
-    let url =
-      "http://" + import.meta.env.VITE_APP_IP + ":20011/download/sanfanApp.apk";
-    window.open(url, "_blank");
-    return;
+    // let url =
+    //   "http://" + import.meta.env.VITE_APP_IP + ":20011/download/sanfanApp.apk";
+    // window.open(url, "_blank");
+    // return;
   }
+
+  !(function () {
+    var a =
+        "@charset \"utf-8\";html{color:#000;background:#fff;overflow-y:scroll;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}html *{outline:0;-webkit-text-size-adjust:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}html,body{font-family:sans-serif}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td,hr,button,article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{margin:0;padding:0}input,select,textarea{font-size:100%}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}abbr,acronym{border:0;font-variant:normal}del{text-decoration:line-through}address,caption,cite,code,dfn,em,th,var{font-style:normal;font-weight:500}ol,ul{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:500}q:before,q:after{content:''}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}a:hover{text-decoration:underline}ins,a{text-decoration:none}",
+      b = document.createElement("style");
+    if ((document.getElementsByTagName("head")[0].appendChild(b), b.styleSheet))
+      b.styleSheet.disabled || (b.styleSheet.cssText = a);
+    else
+      try {
+        b.innerHTML = a;
+      } catch (c) {
+        b.innerText = a;
+      }
+  })();
+  !(function (a, b) {
+    function c() {
+      var b = f.getBoundingClientRect().width;
+      b / i > 540 && (b = 540 * i);
+      var c = b / 10;
+      (f.style.fontSize = c + "px"), (k.rem = a.rem = c);
+    }
+    var d,
+      e = a.document,
+      f = e.documentElement,
+      g = e.querySelector('meta[name="viewport"]'),
+      h = e.querySelector('meta[name="flexible"]'),
+      i = 0,
+      j = 0,
+      k = b.flexible || (b.flexible = {});
+    if (g) {
+      console.warn("灏嗘牴鎹凡鏈夌殑meta鏍囩鏉ヨ缃缉鏀炬瘮渚�");
+      var l = g.getAttribute("content").match(/initial\-scale=([\d\.]+)/);
+      l && ((j = parseFloat(l[1])), (i = parseInt(1 / j)));
+    } else if (h) {
+      var m = h.getAttribute("content");
+      if (m) {
+        var n = m.match(/initial\-dpr=([\d\.]+)/),
+          o = m.match(/maximum\-dpr=([\d\.]+)/);
+        n && ((i = parseFloat(n[1])), (j = parseFloat((1 / i).toFixed(2)))),
+          o && ((i = parseFloat(o[1])), (j = parseFloat((1 / i).toFixed(2))));
+      }
+    }
+    if (!i && !j) {
+      var p =
+          (a.navigator.appVersion.match(/android/gi),
+          a.navigator.appVersion.match(/iphone/gi)),
+        q = a.devicePixelRatio;
+      (i = p
+        ? q >= 3 && (!i || i >= 3)
+          ? 3
+          : q >= 2 && (!i || i >= 2)
+          ? 2
+          : 1
+        : 1),
+        (j = 1 / i);
+    }
+    if ((f.setAttribute("data-dpr", i), !g))
+      if (
+        ((g = e.createElement("meta")),
+        g.setAttribute("name", "viewport"),
+        g.setAttribute(
+          "content",
+          "initial-scale=" +
+            j +
+            ", maximum-scale=" +
+            j +
+            ", minimum-scale=" +
+            j +
+            ", user-scalable=no"
+        ),
+        f.firstElementChild)
+      )
+        f.firstElementChild.appendChild(g);
+      else {
+        var r = e.createElement("div");
+        r.appendChild(g), e.write(r.innerHTML);
+      }
+    a.addEventListener(
+      "resize",
+      function () {
+        clearTimeout(d), (d = setTimeout(c, 300));
+      },
+      !1
+    ),
+      a.addEventListener(
+        "pageshow",
+        function (a) {
+          a.persisted && (clearTimeout(d), (d = setTimeout(c, 300)));
+        },
+        !1
+      ),
+      "complete" === e.readyState
+        ? (e.body.style.fontSize = 12 * i + "px")
+        : e.addEventListener(
+            "DOMContentLoaded",
+            function () {
+              e.body.style.fontSize = 12 * i + "px";
+            },
+            !1
+          ),
+      c(),
+      (k.dpr = a.dpr = i),
+      (k.refreshRem = c),
+      (k.rem2px = function (a) {
+        var b = parseFloat(a) * this.rem;
+        return "string" == typeof a && a.match(/rem$/) && (b += "px"), b;
+      }),
+      (k.px2rem = function (a) {
+        var b = parseFloat(a) / this.rem;
+        return "string" == typeof a && a.match(/px$/) && (b += "rem"), b;
+      });
+  })(window, window.lib || (window.lib = {}));
 });
+
+const handleDownloadApp = () => {
+  let url =
+    "http://" + import.meta.env.VITE_APP_IP + ":20011/download/sanfanApp.apk";
+  window.open(url, "_blank");
+  return;
+};
 </script>
 
 <style lang="scss" scoped>
-.box {
-  margin: 200px auto 0;
-  width: 80%;
-  // height: 300px;
-  // line-height: 300px;
-  padding: 30px 20px;
-  font-size: 30px;
-  background: #909399;
+.bk-img {
+  position: relative;
+  height: 80vw;
+  background: url("@/assets/images/wx-page.png") no-repeat center center;
+  background-size: 100% 100%;
+  .text {
+    font-size: 16px;
+    color: #fff;
+    // padding: 10px;
+  }
+  .dec {
+    position: absolute;
+    display: flex;
+    top: 10px;
+    right: 25px;
+    align-items: center;
+  }
+}
+
+.btn {
+  text-align: center;
+  display: inline-block;
+  // align-items: center;
+  padding: 0px 0.8rem;
+  // margin: 90px px 0;
   color: #fff;
+  background: #1b374c;
+  border-radius: 35px;
+  cursor: pointer;
+  margin-top: 1.5rem;
+  height: 1.4rem;
+  line-height: 1.4rem;
 }
+// .wx {
+//   transform: translateY(-3px);
+// }
+// .nowx {
+//   transform: translateY(-22px);
+// }
+// .textwx {
+//   transform: translateY(5px);
+// }
+// .textnowx {
+//   transform: translateY(-3px);
+// }
 </style>

+ 60 - 0
src/components/headerBar/flexible.js

@@ -0,0 +1,60 @@
+! function () {
+  var a = "@charset \"utf-8\";html{color:#000;background:#fff;overflow-y:scroll;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}html *{outline:0;-webkit-text-size-adjust:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}html,body{font-family:sans-serif}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td,hr,button,article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{margin:0;padding:0}input,select,textarea{font-size:100%}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}abbr,acronym{border:0;font-variant:normal}del{text-decoration:line-through}address,caption,cite,code,dfn,em,th,var{font-style:normal;font-weight:500}ol,ul{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:500}q:before,q:after{content:''}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}a:hover{text-decoration:underline}ins,a{text-decoration:none}",
+    b = document.createElement("style");
+  if (document.getElementsByTagName("head")[0].appendChild(b), b.styleSheet) b.styleSheet.disabled || (b.styleSheet.cssText = a);
+  else try {
+    b.innerHTML = a
+  } catch (c) {
+    b.innerText = a
+  }
+}();
+! function (a, b) {
+  function c() {
+    var b = f.getBoundingClientRect().width;
+    b / i > 540 && (b = 540 * i);
+    var c = b / 10;
+    f.style.fontSize = c + "px", k.rem = a.rem = c
+  }
+  var d, e = a.document,
+    f = e.documentElement,
+    g = e.querySelector('meta[name="viewport"]'),
+    h = e.querySelector('meta[name="flexible"]'),
+    i = 0,
+    j = 0,
+    k = b.flexible || (b.flexible = {});
+  if (g) {
+    console.warn("灏嗘牴鎹凡鏈夌殑meta鏍囩鏉ヨ缃缉鏀炬瘮渚�");
+    var l = g.getAttribute("content").match(/initial\-scale=([\d\.]+)/);
+    l && (j = parseFloat(l[1]), i = parseInt(1 / j))
+  } else if (h) {
+    var m = h.getAttribute("content");
+    if (m) {
+      var n = m.match(/initial\-dpr=([\d\.]+)/),
+        o = m.match(/maximum\-dpr=([\d\.]+)/);
+      n && (i = parseFloat(n[1]), j = parseFloat((1 / i).toFixed(2))), o && (i = parseFloat(o[1]), j = parseFloat((1 / i).toFixed(2)))
+    }
+  }
+  if (!i && !j) {
+    var p = (a.navigator.appVersion.match(/android/gi), a.navigator.appVersion.match(/iphone/gi)),
+      q = a.devicePixelRatio;
+    i = p ? q >= 3 && (!i || i >= 3) ? 3 : q >= 2 && (!i || i >= 2) ? 2 : 1 : 1, j = 1 / i
+  }
+  if (f.setAttribute("data-dpr", i), !g)
+    if (g = e.createElement("meta"), g.setAttribute("name", "viewport"), g.setAttribute("content", "initial-scale=" + j + ", maximum-scale=" + j + ", minimum-scale=" + j + ", user-scalable=no"), f.firstElementChild) f.firstElementChild.appendChild(g);
+    else {
+      var r = e.createElement("div");
+      r.appendChild(g), e.write(r.innerHTML)
+    } a.addEventListener("resize", function () {
+    clearTimeout(d), d = setTimeout(c, 300)
+  }, !1), a.addEventListener("pageshow", function (a) {
+    a.persisted && (clearTimeout(d), d = setTimeout(c, 300))
+  }, !1), "complete" === e.readyState ? e.body.style.fontSize = 12 * i + "px" : e.addEventListener("DOMContentLoaded", function () {
+    e.body.style.fontSize = 12 * i + "px"
+  }, !1), c(), k.dpr = a.dpr = i, k.refreshRem = c, k.rem2px = function (a) {
+    var b = parseFloat(a) * this.rem;
+    return "string" == typeof a && a.match(/rem$/) && (b += "px"), b
+  }, k.px2rem = function (a) {
+    var b = parseFloat(a) / this.rem;
+    return "string" == typeof a && a.match(/px$/) && (b += "rem"), b
+  }
+}(window, window.lib || (window.lib = {}));

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

@@ -465,7 +465,10 @@ const handleTabChange = (val) => {
         //   "http://" +
         //   import.meta.env.VITE_APP_IP +
         //   ":20011/download/sanfanApp.apk",
-        text: import.meta.env.VITE_APP_IP + ":20010/sanfan/downloadApp",
+        text:
+          import.meta.env.VITE_APP_IP +
+          import.meta.env.VITE_APP_PORT +
+          "/sanfan/downloadApp",
         width: 200,
         height: 200,
         colorDark: "#000000",

+ 77 - 23
src/components/process/SF/CostControl.vue

@@ -276,7 +276,8 @@
               <template #default="{ row, $index }">
                 <el-form-item :prop="'costControlDetailList.' + $index + '.costType'" :rules="rules.costType" :inline-message="true"
                               class="margin-b-0">
-                  <el-select v-model="row.costType" placeholder="请选择" style="width: 100%" filterable :disabled="isDisabled">
+                  <el-select v-model="row.costType" placeholder="请选择" style="width: 100%" filterable :disabled="isDisabled"
+                             @change="()=>handleGetRemark($index)">
                     <el-option v-for="item in expenseType" :key="item.dictKey" :label="item.dictValue" :value="item.dictKey" />
                   </el-select>
                 </el-form-item>
@@ -286,16 +287,21 @@
               <template #default="{ row, $index }">
                 <el-form-item :prop="'costControlDetailList.' + $index + '.brushingTime'" :rules="rules.brushingTime" :inline-message="true"
                               class="margin-b-0" v-if="row.costType=='1'">
-                  <el-date-picker v-model="row.brushingTime" type="date" placeholder="请选择" style="width: 100%" value-format="YYYY-MM-DD"
+                  <el-date-picker v-model="row.brushingTime" type="date" placeholder="刷单开始时间" style="width: 100%" value-format="YYYY-MM-DD"
+                                  :disabled="isDisabled" />
+                </el-form-item>
+                <el-form-item :prop="'costControlDetailList.' + $index + '.brushingEndTime'" :rules="rules.brushingEndTime" :inline-message="true"
+                              class="margin-b-0" v-if="row.costType=='1'">
+                  <el-date-picker v-model="row.brushingEndTime" type="date" placeholder="刷单结束时间" style="width: 100%" value-format="YYYY-MM-DD"
                                   :disabled="isDisabled" />
                 </el-form-item>
                 <el-form-item :prop="'costControlDetailList.' + $index + '.promotionFeeType'" :rules="rules.promotionFeeType" :inline-message="true"
-                              class="margin-b-0" v-else-if="row.costType=='2'">
+                              class="margin-b-0" v-if="row.costType=='2'">
                   <el-select v-model="row.promotionFeeType" placeholder="请选择" style="width: 100%" filterable :disabled="isDisabled">
                     <el-option v-for="item in promotionFeeType" :key="item.dictKey" :label="item.dictValue" :value="item.dictKey" />
                   </el-select>
                 </el-form-item>
-                <div v-else>-</div>
+
               </template>
             </el-table-column>
             <el-table-column prop="currentPayableDeductionBefore" label="本期应付(抵扣前)" width="140"
@@ -399,7 +405,7 @@
                                     @change="(val)=>changeAccountSubjectsId(val,$index)" /> -->
 
                     <el-select v-model="row.accountSubjectsId" :placeholder="'请选择'" style="width: 100%" filterable
-                               @change="(val)=>changeAccountSubjectsId(val,$index)">
+                               @change="(val)=>changeAccountSubjectsId(val,$index)" :disabled="!isHaveAccount || !isHaveFinance">
                       <el-option v-for="item in accountSubjectsList" :key="item.value" :label="item.label" :value="item.value" />
                     </el-select>
                   </el-form-item>
@@ -430,14 +436,15 @@
                        :style="{ marginBottom:row.subjectsCalculateItemNameList.length > index+1  ? '10px' : '' }">
                     <el-tree-select v-model="row.submitMapData[key]" :data="selectDataMap[key]" check-strictly node-key="deptId"
                                     :props="defaultPropsDept" :placeholder="'请选择'+key" style="width:100%" filterable
-                                    v-if="['核算中心', '部门' ].includes(key)" @change="(val)=>getLabelData(val,key,$index)" />
+                                    v-if="['核算中心', '部门' ].includes(key)" @change="(val)=>getLabelData(val,key,$index)"
+                                    :disabled="!isHaveAccount || !isHaveFinance" />
                     <div v-else-if="['客户'].includes(key)">
-                      <el-button type="primary" @click="handleOpenSelectCustomer($index)" plain v-if="getAccountSubjectsId"
-                                 style="margin-bottom:10px">选择客户</el-button>
+                      <el-button type="primary" @click="handleOpenSelectCustomer($index)" plain v-if="getAccountSubjectsId" style="margin-bottom:10px"
+                                 :disabled="!isHaveAccount || !isHaveFinance">选择客户</el-button>
                       <el-input v-model="row.customerName" placeholder="请选择客户" disabled></el-input>
                     </div>
                     <el-select v-model="row.submitMapData[key]" :placeholder="'请选择'+key" style="width: 100%" filterable v-else
-                               @change="(val)=>getLabelData(val,key,$index)">
+                               @change="(val)=>getLabelData(val,key,$index)" :disabled="!isHaveAccount || !isHaveFinance">
                       <el-option v-for="item in selectDataMap[key]" :key="item.value" :label="item.label" :value="item.value" />
                     </el-select>
                   </div>
@@ -449,7 +456,7 @@
                 <div style="width: 100%">
                   <el-form-item :prop="'costControlDetailList.' + $index + '.money'" :rules="rules.money" :inline-message="true" class="margin-b-0">
                     <el-input-number onmousewheel="return false;" v-model="row.money" placeholder=" " style="width: 100%" :precision="2"
-                                     :controls="false" :min="0" />
+                                     :controls="false" :min="0" :disabled="!isHaveAccount || !isHaveFinance" />
                   </el-form-item>
                 </div>
               </template>
@@ -883,7 +890,10 @@ const formConfig = computed(() => {
         changeShroffAccount(val);
       },
       disabled: !isHaveFinance.value,
-      isShow: isShowAtt("paymentAccountId", "mainObj"),
+      isShow:
+        isShowAtt("paymentAccountId", "mainObj") &&
+        formData.data.isPublicTransfer &&
+        formData.data.isPublicTransfer == "1",
     },
     {
       type: "input",
@@ -892,7 +902,10 @@ const formConfig = computed(() => {
       placeholder: "请输入开户行",
       itemWidth: 25,
       disabled: !isHaveFinance.value,
-      isShow: isShowAtt("paymentAccountId", "mainObj"),
+      isShow:
+        isShowAtt("paymentAccountId", "mainObj") &&
+        formData.data.isPublicTransfer &&
+        formData.data.isPublicTransfer == "1",
     },
     {
       type: "input",
@@ -901,7 +914,10 @@ const formConfig = computed(() => {
       placeholder: "请输入开户名",
       itemWidth: 25,
       disabled: !isHaveFinance.value,
-      isShow: isShowAtt("paymentAccountId", "mainObj"),
+      isShow:
+        isShowAtt("paymentAccountId", "mainObj") &&
+        formData.data.isPublicTransfer &&
+        formData.data.isPublicTransfer == "1",
     },
     {
       type: "input",
@@ -910,7 +926,10 @@ const formConfig = computed(() => {
       placeholder: "请输入账号",
       itemWidth: 25,
       disabled: !isHaveFinance.value,
-      isShow: isShowAtt("paymentAccountId", "mainObj"),
+      isShow:
+        isShowAtt("paymentAccountId", "mainObj") &&
+        formData.data.isPublicTransfer &&
+        formData.data.isPublicTransfer == "1",
     },
     {
       type: "title",
@@ -924,7 +943,8 @@ const formConfig = computed(() => {
       label: "开户行",
       placeholder: "请输入开户行",
       itemWidth: 25,
-      disabled: isDisabled.value,
+      // disabled: isDisabled.value,
+      disabled: true,
       isShow: getIsShowData("accountBank"),
     },
     {
@@ -933,7 +953,8 @@ const formConfig = computed(() => {
       label: "开户名",
       placeholder: "请输入开户名",
       itemWidth: 25,
-      disabled: isDisabled.value,
+      // disabled: isDisabled.value,
+      disabled: true,
       // isShow: isShowAtt("accountName", "mainObj"),
       isShow: getIsShowData("accountName"),
     },
@@ -943,7 +964,8 @@ const formConfig = computed(() => {
       label: "账号",
       placeholder: "请输入账号",
       itemWidth: 25,
-      disabled: isDisabled.value,
+      // disabled: isDisabled.value,
+      disabled: true,
       // isShow: isShowAtt("accountNumber", "mainObj"),
       isShow: getIsShowData("accountNumber"),
     },
@@ -1043,7 +1065,10 @@ const rules = ref({
   supplierId: [{ required: true, message: "请选择供应商", trigger: "change" }],
   costType: [{ required: true, message: "请选择费用类型", trigger: "change" }],
   brushingTime: [
-    { required: true, message: "请选择刷单时间", trigger: "change" },
+    { required: true, message: "请选择刷单开始时间", trigger: "change" },
+  ],
+  brushingEndTime: [
+    { required: true, message: "请选择刷单结束时间", trigger: "change" },
   ],
   promotionFeeType: [
     { required: true, message: "请选择推广费类别", trigger: "change" },
@@ -1498,6 +1523,17 @@ const handleChangeMoney = (val, index, att) => {
           ? row.currentPrepaidTax
           : row.currentPrepaid;
     } else if (currentCostTypeData.value.name.indexOf("快递费付款") != -1) {
+      if (formData.data.isPublicTransfer == "1") {
+        if (row.balancePrepaidTax < row.deductionPrepaidTax) {
+          row.deductionPrepaidTax = 0;
+          return proxy.msgTip("抵扣预付款不可大于结存预付款");
+        }
+      } else {
+        if (row.balancePrepaid < row.deductionPrepaid) {
+          row.deductionPrepaid = 0;
+          return proxy.msgTip("抵扣预付款不可大于结存预付款");
+        }
+      }
       row.currentPayable =
         formData.data.isPublicTransfer == "1"
           ? Number(
@@ -1770,6 +1806,7 @@ const getBtnDisabled = () => {
 
 const handleGetRemark = (index) => {
   let row = formData.data.costControlDetailList[index];
+  let label = row.submitMapLabelData["职员"] || "";
   let money = 0;
   money = parseFloat(Number(row.currentPayable)).toFixed(2);
   // formData.data.costControlDetailList[
@@ -1786,19 +1823,20 @@ const handleGetRemark = (index) => {
   } else if (currentCostTypeData.value.name.indexOf("备用金") != -1) {
     formData.data.costControlDetailList[
       index
-    ].remark = `支付${row.applyRemark}备用金${money}`;
+    ].remark = `支付${label}备用金${money}`;
   } else if (currentCostTypeData.value.name.indexOf("借款") != -1) {
     formData.data.costControlDetailList[
       index
-    ].remark = `支付${row.applyRemark}借款${money}`;
+    ].remark = `支付${label}借款${money}`;
   } else if (currentCostTypeData.value.name.indexOf("快递") != -1) {
     formData.data.costControlDetailList[
       index
     ].remark = `支付${row.businessName}${currentCostTypeData.value.name}${money}`;
   } else if (currentCostTypeData.value.name.indexOf("店铺") != -1) {
+    let label = proxy.dictKeyValue(row.costType, expenseType.value);
     formData.data.costControlDetailList[
       index
-    ].remark = `支付${row.businessName}${currentCostTypeData.value.name}${money}`;
+    ].remark = `支付${row.businessName}${label}${money}`;
   } else if (currentCostTypeData.value.name.indexOf("采购") != -1) {
     formData.data.costControlDetailList[
       index
@@ -1827,6 +1865,7 @@ const clickAdd = () => {
       subjectsCalculateItemNameList: subjectsCalculateItemNameList.value,
       submitMapData: {},
       submitMapLabelData: {},
+      submitMapCodeData: {},
       logisticsCompanyId: "",
       invoiceTaxPoint: "",
       currentPayable: null,
@@ -1865,6 +1904,7 @@ const clickAdd = () => {
         subjectsCalculateItemNameList: subjectsCalculateItemNameList.value,
         submitMapData: {},
         submitMapLabelData: {},
+        submitMapCodeData: {},
         logisticsCompanyId: "",
         invoiceTaxPoint: "",
         currentPayable: null,
@@ -1935,12 +1975,17 @@ const getLabelData = (val, key, index) => {
       if (current) {
         formData.data.costControlDetailList[index].submitMapLabelData[key] =
           current.deptName;
+        formData.data.costControlDetailList[index].submitMapCodeData[key] =
+          current.jdSubjectCode;
       }
     } else {
       let current = data.find((x) => x.value == val);
       if (current) {
         formData.data.costControlDetailList[index].submitMapLabelData[key] =
           current.label;
+        formData.data.costControlDetailList[index].submitMapCodeData[key] =
+          current.jdSubjectCode;
+        handleGetRemark(index);
       }
     }
   }
@@ -2073,7 +2118,7 @@ const handleSubmit = async (isStag = false) => {
       for (let i = 0; i < formData.data.costControlDetailList.length; i++) {
         const row = formData.data.costControlDetailList[i];
         let calculateItemList = [];
-        let calculateItemStr = row.accountSubjectsNames + " - ";
+        let calculateItemStr = "";
         if (
           row.subjectsCalculateItemNameList &&
           row.subjectsCalculateItemNameList.length > 0
@@ -2081,13 +2126,22 @@ const handleSubmit = async (isStag = false) => {
           for (let j = 0; j < row.subjectsCalculateItemNameList.length; j++) {
             const key = row.subjectsCalculateItemNameList[j];
             if (row.submitMapData[key]) {
+              row["calculateItemType" + (j + 1 + "")] = key;
+              row["calculateItemName" + (j + 1 + "")] =
+                row.submitMapLabelData[key];
               calculateItemList.push({
                 type: key,
                 businessId: row.submitMapData[key],
+                businessName: row.submitMapLabelData[key],
+                businessCode: row.submitMapCodeData[key],
               });
               calculateItemStr +=
+                key +
+                "---" +
+                row.submitMapCodeData[key] +
+                "---" +
                 row.submitMapLabelData[key] +
-                (j < row.subjectsCalculateItemNameList.length - 1 ? " - " : "");
+                (j < row.subjectsCalculateItemNameList.length - 1 ? "||" : "");
             }
           }
         }

+ 26 - 0
src/components/process/SF/Purchase.vue

@@ -360,6 +360,12 @@ const shippingMethod = computed(
 const frontLinesData = computed(
   () => proxy.useUserStore().allDict["front_lines"]
 );
+const supplierShippingMethod = computed(
+  () => proxy.useUserStore().allDict["supplier_shipping_method"]
+);
+const supplierPaymentMethod = computed(
+  () => proxy.useUserStore().allDict["supplier_payment_method"]
+);
 // const companyId = computed(() => proxy.useUserStore().user.companyId);
 const deliveryType = ref([
   {
@@ -602,6 +608,24 @@ const formConfig = computed(() => {
       placeholder: " ",
     },
     {
+      type: "select",
+      prop: "deliverMethod",
+      label: "发货方式",
+      required: true,
+      filterable: true,
+      data: supplierShippingMethod.value,
+      itemWidth: 33.33,
+    },
+    {
+      type: "select",
+      prop: "paymentMethod",
+      label: "付款方式",
+      required: true,
+      filterable: true,
+      data: supplierPaymentMethod.value,
+      itemWidth: 33.33,
+    },
+    {
       type: "upload",
       listType: "text",
       accept: "",
@@ -1015,6 +1039,8 @@ const changeSupplier = (val) => {
       setTimeout(() => changeAddress(), 1500);
       formData.data.supplierIncludingTax = res.privIncludingTax;
       formData.data.supplierTaxPoints = res.privTaxPoints;
+      formData.data.deliverMethod = res.deliverMethod;
+      formData.data.paymentMethod = res.paymentMethod;
     });
   }
 };

+ 6 - 2
src/components/process/SF/Subscribe.vue

@@ -39,7 +39,7 @@
                   <el-form-item :prop="'subscribeDetailList.' + $index + '.price'" :rules="rules.price" :inline-message="true"
                                 class="margin-b-0 wid100">
                     <el-input-number onmousewheel="return false;" v-model="row.price" placeholder="请输入" style="width: 100%" :precision="2"
-                                     :controls="false" :min="0" @change="calculationAmount()" />
+                                     :controls="false" :min="0" @change="calculationAmount(true)" />
                   </el-form-item>
                 </div>
               </template>
@@ -494,12 +494,16 @@ const getDict = () => {
 };
 getDict();
 
-const calculationAmount = () => {
+const calculationAmount = (flag = false) => {
   if (
     formData.data.subscribeDetailList &&
     formData.data.subscribeDetailList.length > 0
   ) {
     for (let i = 0; i < formData.data.subscribeDetailList.length; i++) {
+      if (flag && formData.data.isAppoint == "0") {
+        formData.data.subscribeDetailList[i].priceIncludingTax =
+          formData.data.subscribeDetailList[i].price;
+      }
       formData.data.subscribeDetailList[i].amount = parseFloat(
         Number(formData.data.subscribeDetailList[i].count) *
           Number(formData.data.subscribeDetailList[i].price)

+ 3 - 0
src/router/index.js

@@ -62,6 +62,9 @@ export const constantRoutes = [{
     path: "/sanfan/downloadApp",
     component: () => import("@/components/headerBar/downloadApp"),
     hidden: false,
+    meta: {
+      title: "App下载",
+    },
   },
   // 其他
   {

+ 10 - 0
src/views/JST/shopManage/index.vue

@@ -284,6 +284,16 @@ const formConfig = computed(() => {
       placeholder: "请输入账号",
       itemWidth: 100,
     },
+    {
+      type: "input",
+      prop: "jdSubjectCode",
+      label: "核算项目编号",
+    },
+    {
+      type: "input",
+      prop: "jdSubjectName",
+      label: "核算项目名称",
+    },
   ];
 });
 const rules = ref({

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

@@ -14,13 +14,13 @@
       <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="submit" v-loading="loadingDialog">
         <template #balance>
           <div style="width: 100%">
-            <el-button type="primary" @click="clickBalance">添加</el-button>
+            <el-button type="primary" @click="clickBalance" :disabled="formData.data.accountRemainderList.length>0">添加</el-button>
             <el-table :data="formData.data.accountRemainderList" style="width: 100%; margin-top: 16px">
               <el-table-column label="币种">
                 <template #default="{ row, $index }">
                   <el-form-item :prop="'accountRemainderList.' + $index + '.currency'" :rules="rules.currency" :inline-message="true"
                                 class="margin-b-0 wid100">
-                    <el-select v-model="row.currency" placeholder="请选择币种" style="width: 100%" :disabled="row.id">
+                    <el-select v-model="row.currency" placeholder="请选择币种" style="width: 100%" disabled>
                       <el-option v-for="item in accountCurrency" :key="item.dictKey" :label="item.dictValue" :value="item.dictKey" />
                     </el-select>
                   </el-form-item>
@@ -35,11 +35,11 @@
                   </el-form-item>
                 </template>
               </el-table-column>
-              <el-table-column label="操作" width="80">
+              <!-- <el-table-column label="操作" width="80">
                 <template #default="{ row, $index }">
                   <el-button type="primary" link @click="handleRemove($index)" v-if="!row.id">删除</el-button>
                 </template>
-              </el-table-column>
+              </el-table-column> -->
             </el-table>
           </div>
         </template>
@@ -388,15 +388,15 @@ const formConfig = computed(() => {
     //   itemType: "text",
     //   itemWidth: 50,
     // },
-    // {
-    //   type: "title1",
-    //   title: "账户余额",
-    // },
-    // {
-    //   type: "slot",
-    //   slotName: "balance",
-    //   label: "账户余额",
-    // },
+    {
+      type: "title1",
+      title: "账户余额",
+    },
+    {
+      type: "slot",
+      slotName: "balance",
+      label: "账户余额",
+    },
   ];
 });
 const rules = ref({
@@ -420,7 +420,7 @@ const formData = reactive({
 const openModal = (val) => {
   modalType.value = val;
   formData.data = {
-    accountRemainderList: [{ currency: "", remainder: undefined }],
+    accountRemainderList: [{ currency: "CNY", remainder: undefined }],
   };
   loadingDialog.value = false;
   dialogVisible.value = true;
@@ -431,12 +431,12 @@ const clickBalance = () => {
     formData.data.accountRemainderList.length > 0
   ) {
     formData.data.accountRemainderList.push({
-      currency: "",
+      currency: "CNY",
       remainder: undefined,
     });
   } else {
     formData.data.accountRemainderList = [
-      { currency: "", remainder: undefined },
+      { currency: "CNY", remainder: undefined },
     ];
   }
 };

+ 10 - 0
src/views/finance/fundManage/kdCompany/index.vue

@@ -254,6 +254,16 @@ const formConfig = computed(() => {
       itemWidth: 50,
       itemType: "text",
     },
+    {
+      type: "input",
+      prop: "jdSubjectCode",
+      label: "核算项目编号",
+    },
+    {
+      type: "input",
+      prop: "jdSubjectName",
+      label: "核算项目名称",
+    },
   ];
 });
 const rules = ref({

+ 10 - 0
src/views/finance/fundManage/payee/index.vue

@@ -200,6 +200,16 @@ const formConfig = computed(() => {
       itemWidth: 50,
       itemType: "text",
     },
+    {
+      type: "input",
+      prop: "jdSubjectCode",
+      label: "核算项目编号",
+    },
+    {
+      type: "input",
+      prop: "jdSubjectName",
+      label: "核算项目名称",
+    },
   ];
 });
 const rules = ref({

+ 11 - 7
src/views/finance/fundManage/paymentType/index.vue

@@ -153,10 +153,14 @@ const getDict = () => {
   });
 
   proxy
-    .post("/accountSubjects/list", { pageNum: 1, pageSize: 999 })
+    .post("/accountSubjects/page", { pageNum: 1, pageSize: 999 })
     .then((res) => {
-      accountSubjectsList.value = res;
-      accountSubjectsData.value = proxy.handleTree(res, "id");
+      accountSubjectsList.value = res.rows.map((x) => ({
+        ...x,
+        label: x.subjectsName,
+        value: x.value,
+      }));
+      // accountSubjectsData.value = proxy.handleTree(res, "id");
     });
 };
 const getList = async (req) => {
@@ -211,13 +215,13 @@ const formConfig = computed(() => {
       itemType: "textarea",
     },
     {
-      type: "treeSelect",
+      type: "select",
       prop: "accountSubjectsId",
       label: "记帐科目",
-      data: accountSubjectsData.value,
+      data: accountSubjectsList.value,
       clearable: true,
-      propsTreeLabel: "subjectsName",
-      propsTreeValue: "id",
+      // propsTreeLabel: "subjectsName",
+      // propsTreeValue: "id",
       itemWidth: 50,
       fn: (val) => {
         // getDeptData(val);

+ 2 - 2
src/views/index.vue

@@ -446,7 +446,7 @@ const getData = () => {
 
   // 待入库
   proxy
-    .post("/stockWaitDetails/page", {
+    .post("/stockWait/page", {
       pageNum: 1,
       pageSize: 5,
       type: 1,
@@ -456,7 +456,7 @@ const getData = () => {
     });
   // 待出库
   proxy
-    .post("/stockWaitDetails/page", {
+    .post("/stockWait/page", {
       pageNum: 1,
       pageSize: 5,
       type: 2,

+ 24 - 0
src/views/purchaseManage/supplier/supplier/index.vue

@@ -185,6 +185,12 @@ const supplierStatus = computed(
 const invoiceType = computed(
   () => proxy.useUserStore().allDict["invoice_type"]
 );
+const supplierShippingMethod = computed(
+  () => proxy.useUserStore().allDict["supplier_shipping_method"]
+);
+const supplierPaymentMethod = computed(
+  () => proxy.useUserStore().allDict["supplier_payment_method"]
+);
 
 const loading = ref(false);
 const submitLoading = ref(false);
@@ -484,6 +490,24 @@ const formConfig = computed(() => {
       label: "账期信息",
     },
     {
+      type: "select",
+      prop: "deliverMethod",
+      label: "发货方式",
+      required: true,
+      filterable: true,
+      data: supplierShippingMethod.value,
+      itemWidth: 50,
+    },
+    {
+      type: "select",
+      prop: "paymentMethod",
+      label: "付款方式",
+      required: true,
+      filterable: true,
+      data: supplierPaymentMethod.value,
+      itemWidth: 50,
+    },
+    {
       type: "input",
       label: "传真",
       prop: "fax",

+ 93 - 60
src/views/report/remittanceDetails/index.vue

@@ -2,14 +2,15 @@
   <div class="pageIndexClass">
     <div class="content">
       <byTable :source="sourceList.data" :pagination="sourceList.pagination" :selectConfig="selectConfig" :config="config" :loading="loading"
-               highlight-current-row :action-list="[{
-                text: '导出Excel',
-                action: () => exportExcel(),
-                disabled: false,
-              }
+               highlight-current-row :action-list="[
         
         ]" @get-list="getList">
 
+        <!-- {
+        text: '导出Excel',
+        action: () => exportExcel(),
+        disabled: false,
+        } -->
         <template #code="{item}">
           <div style="width:100%">
             <span class="el-click" @click="getDtl(item)">{{item.code}}</span>
@@ -81,6 +82,7 @@ const accountAgeList = ref([
     value: "120以上",
   },
 ]);
+
 const sourceList = ref({
   data: [],
   pagination: {
@@ -193,52 +195,46 @@ const config = computed(() => {
     {
       attrs: {
         label: "打款日期",
-        prop: "salesmanName",
-        width: 100,
+        prop: "transactionTime",
+        width: 160,
+        fixed: "left",
       },
     },
     {
       attrs: {
         label: "银行卡",
-        prop: "merchUserName",
-        width: 100,
+        prop: "accountAliasName",
+        width: 130,
+        fixed: "left",
       },
     },
     {
       attrs: {
         label: "收付款说明",
-        prop: "contractType",
-        width: 130,
-      },
-      render(val) {
-        return proxy.dictKeyValue(val, contractType.value);
+        prop: "remark",
+        width: 160,
+        fixed: "left",
       },
     },
     {
       attrs: {
         label: "对方科目",
-        prop: "belongType",
+        prop: "oppositeSubjectName1",
         width: 110,
       },
-      render(val) {
-        return proxy.dictKeyValue(val, belongTypeData.value);
-      },
     },
     {
       attrs: {
         label: "销售组费用类别",
-        prop: "amount",
-        width: 100,
-      },
-      render(val) {
-        return proxy.moneyFormat(val, 2);
+        prop: "saleGroupExpenseCategory",
+        width: 130,
       },
     },
     {
       attrs: {
         label: "收入",
-        prop: "factoryAmount",
-        width: 120,
+        prop: "incomeAmount",
+        width: 100,
       },
       render(val) {
         return proxy.moneyFormat(val, 2);
@@ -247,8 +243,8 @@ const config = computed(() => {
     {
       attrs: {
         label: "支出",
-        prop: "sumOutFactoryMoney",
-        width: 160,
+        prop: "expenditureAmount",
+        width: 100,
       },
       render(val) {
         return proxy.moneyFormat(val, 2);
@@ -257,8 +253,8 @@ const config = computed(() => {
     {
       attrs: {
         label: "余额",
-        prop: "deposit",
-        width: 90,
+        prop: "balanceAmount",
+        width: 100,
       },
       render(val) {
         return proxy.moneyFormat(val, 2);
@@ -266,80 +262,117 @@ const config = computed(() => {
     },
     {
       attrs: {
-        label: "科目名称",
-        prop: "isSettlement",
+        label: "供应商",
+        prop: "supplierName",
+        width: 150,
+      },
+    },
+    {
+      attrs: {
+        label: "客户简称",
+        prop: "customerShortName",
         width: 100,
       },
-      render(val) {
-        return val == 1 ? "是" : "否";
+    },
+    {
+      attrs: {
+        label: "合同单号",
+        prop: "contractCode",
+        width: 130,
       },
     },
     {
       attrs: {
-        label: "核算项目",
-        slot: "time",
-        width: 180,
+        label: "科目名称",
+        prop: "subjectName",
+        width: 150,
       },
     },
     {
       attrs: {
         label: "核算项目1",
-        prop: "customerName",
-        "min-width": 180,
+        prop: "calculateItemType1",
+        width: 180,
       },
     },
     {
       attrs: {
         label: "核算项目2",
-        prop: "customerShortName",
-        width: 110,
+        prop: "calculateItemType2",
+        width: 180,
       },
     },
     {
       attrs: {
-        label: "对方科目代码",
-        prop: "receivableAmount",
-        width: 90,
+        label: "核算项目1名称",
+        prop: "calculateItemName1",
+        width: 180,
       },
-      render(val) {
-        return proxy.moneyFormat(val, 2);
+    },
+    {
+      attrs: {
+        label: "核算项目2名称",
+        prop: "calculateItemName2",
+        width: 180,
       },
     },
     {
       attrs: {
-        label: "对方科目名称",
-        prop: "sumClaimMoney",
-        width: 90,
+        label: "对方科目代码",
+        prop: "oppositeSubjectCode",
+        width: 130,
       },
-      render(val) {
-        return proxy.moneyFormat(val, 2);
+    },
+    {
+      attrs: {
+        label: "对方科目名称",
+        prop: "oppositeSubjectName",
+        width: 130,
       },
     },
     {
       attrs: {
         label: "核算项目数据导入",
-        prop: "outstandingAmount",
-        width: 90,
+        prop: "calculateItemStr",
+        width: 200,
       },
-      render(val) {
-        return proxy.moneyFormat(val, 2);
+    },
+    {
+      attrs: {
+        label: "银行科目代码",
+        prop: "bankSubjectCode",
+        width: 130,
+      },
+    },
+    {
+      attrs: {
+        label: "银行科目名称",
+        prop: "bankSubjectName",
+        width: 130,
+      },
+    },
+    {
+      attrs: {
+        label: "合并科目核算项目名称",
+        prop: "subjectCalculateItemStr",
+        width: 200,
       },
     },
     {
       attrs: {
         label: "记账凭证号",
-        prop: "firstTruckDate",
-        width: 110,
+        prop: "voucherNo",
+        width: 130,
       },
     },
     {
       attrs: {
         label: "订单性质",
-        prop: "accountAge",
-        width: 100,
+        prop: "belongType",
+        width: 90,
       },
       render(val) {
-        return proxy.dictValueLabel(val, accountAgeList.value);
+        return proxy.dictKeyValue(val, belongTypeData.value);
       },
     },
     // {
@@ -435,7 +468,7 @@ const getList = async (req) => {
   sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
   loading.value = true;
   proxy
-    .post("/report/orderSummary", sourceList.value.pagination)
+    .post("/report/finance/remitDetailPage", sourceList.value.pagination)
     .then((res) => {
       sourceList.value.data = res.rows;
       sourceList.value.pagination.total = res.total;

+ 10 - 0
src/views/systemTenant/otherManage/artCopyright/index.vue

@@ -192,6 +192,16 @@ const formConfig = computed(() => {
     //   placeholder: "请输入账号",
     //   itemWidth: 100,
     // },
+    {
+      type: "input",
+      prop: "jdSubjectCode",
+      label: "核算项目编号",
+    },
+    {
+      type: "input",
+      prop: "jdSubjectName",
+      label: "核算项目名称",
+    },
   ];
 });
 const rules = ref({

+ 10 - 0
src/views/systemTenant/otherManage/contractor/index.vue

@@ -199,6 +199,16 @@ const formConfig = computed(() => {
       itemWidth: 50,
       itemType: "text",
     },
+    {
+      type: "input",
+      prop: "jdSubjectCode",
+      label: "核算项目编号",
+    },
+    {
+      type: "input",
+      prop: "jdSubjectName",
+      label: "核算项目名称",
+    },
   ];
 });
 const rules = ref({

+ 10 - 0
src/views/systemTenant/otherManage/patentManage/index.vue

@@ -192,6 +192,16 @@ const formConfig = computed(() => {
     //   placeholder: "请输入账号",
     //   itemWidth: 100,
     // },
+    {
+      type: "input",
+      prop: "jdSubjectCode",
+      label: "核算项目编号",
+    },
+    {
+      type: "input",
+      prop: "jdSubjectName",
+      label: "核算项目名称",
+    },
   ];
 });
 const rules = ref({

+ 10 - 0
src/views/systemTenant/otherManage/trademarkManage/index.vue

@@ -192,6 +192,16 @@ const formConfig = computed(() => {
     //   placeholder: "请输入账号",
     //   itemWidth: 100,
     // },
+    {
+      type: "input",
+      prop: "jdSubjectCode",
+      label: "核算项目编号",
+    },
+    {
+      type: "input",
+      prop: "jdSubjectName",
+      label: "核算项目名称",
+    },
   ];
 });
 const rules = ref({

+ 11 - 0
src/views/systemTenant/tenant/deptTenant/index.vue

@@ -208,6 +208,17 @@ const formConfig = computed(() => {
       prop: "jstDistributor",
       label: "聚水潭分销商",
     },
+    {
+      type: "input",
+      prop: "jdSubjectCode",
+      label: "核算项目编号",
+    },
+    {
+      type: "input",
+      prop: "jdSubjectName",
+      label: "核算项目名称",
+    },
+
     // {
     //   type: "select",
     //   prop: "nature",