Browse Source

服务合同

lxf 2 years ago
parent
commit
2ee22df09e

+ 16 - 18
src/components/process/Contract.vue

@@ -124,7 +124,7 @@
               </template>
             </el-table-column>
             <el-table-column prop="code" label="商品编码" width="120" />
-            <el-table-column label="商品名称">
+            <el-table-column label="商品名称" min-width="200">
               <template #default="{ row, $index }">
                 <div style="width: 100%">
                   <el-form-item :prop="'contractProductList.' + $index + '.productName'" :rules="rules.productName" :inline-message="true">
@@ -176,7 +176,7 @@
               </template>
             </el-table-column>
             <el-table-column prop="amount" label="金额" width="140" />
-            <el-table-column align="center" label="操作" width="120">
+            <el-table-column align="center" label="操作" width="120" fixed="right">
               <template #default="{ row, $index }">
                 <el-button type="primary" link @click="handleHandover(row, $index)">交接单</el-button>
                 <el-button type="primary" link @click="handleRemove($index)">删除</el-button>
@@ -223,7 +223,7 @@
                 </div>
               </template>
             </el-table-column>
-            <el-table-column align="center" label="操作" width="80">
+            <el-table-column align="center" label="操作" width="80" fixed="right">
               <template #default="{ row, $index }">
                 <el-button type="primary" link @click="handleDelete($index)">删除</el-button>
               </template>
@@ -353,7 +353,7 @@
                 </div>
               </template>
             </el-table-column>
-            <el-table-column align="center" label="操作" width="120">
+            <el-table-column align="center" label="操作" width="120" fixed="right">
               <template #default="{ row, $index }">
                 <el-button type="primary" link @click="clickSplit(row)">拆分</el-button>
                 <el-button type="primary" link @click="clickDelete($index)">删除</el-button>
@@ -481,7 +481,7 @@ const formConfig = computed(() => {
     {
       type: "slot",
       slotName: "offerMoney",
-      label: "报价金额",
+      label: "收款信息",
     },
     {
       type: "slot",
@@ -900,21 +900,19 @@ const onPreviewFile = (file) => {
   window.open(file.raw.fileUrl, "_blank");
 };
 const submitHandoverForm = () => {
+  formData.data.contractProductList[productIndex.value].remark = productRow.data.remark;
   if (fileList.value && fileList.value.length > 0) {
-    formData.data.contractProductList[productIndex.value].remark = productRow.data.remark;
-    if (fileList.value && fileList.value.length > 0) {
-      formData.data.contractProductList[productIndex.value].fileList = fileList.value.map((item) => {
-        return {
-          id: item.raw.id,
-          fileName: item.raw.fileName,
-          fileUrl: item.raw.fileUrl,
-        };
-      });
-    } else {
-      formData.data.contractProductList[productIndex.value].fileList = [];
-    }
-    openHandover.value = false;
+    formData.data.contractProductList[productIndex.value].fileList = fileList.value.map((item) => {
+      return {
+        id: item.raw.id,
+        fileName: item.raw.fileName,
+        fileUrl: item.raw.fileUrl,
+      };
+    });
+  } else {
+    formData.data.contractProductList[productIndex.value].fileList = [];
   }
+  openHandover.value = false;
 };
 const handleRemove = (index) => {
   formData.data.contractProductList.splice(index, 1);

+ 3 - 3
src/components/process/PriceSheet.vue

@@ -124,7 +124,7 @@
               </template>
             </el-table-column>
             <el-table-column prop="code" label="商品编码" width="120" />
-            <el-table-column label="商品名称">
+            <el-table-column label="商品名称" min-width="200">
               <template #default="{ row, $index }">
                 <div style="width: 100%">
                   <el-form-item :prop="'quotationProductList.' + $index + '.productName'" :rules="rules.productName" :inline-message="true">
@@ -176,7 +176,7 @@
               </template>
             </el-table-column>
             <el-table-column prop="amount" label="金额" width="140" />
-            <el-table-column label="操作" width="80">
+            <el-table-column label="操作" width="80" fixed="right">
               <template #default="{ row, $index }">
                 <el-button type="primary" link @click="handleRemove($index)">删除</el-button>
               </template>
@@ -222,7 +222,7 @@
                 </div>
               </template>
             </el-table-column>
-            <el-table-column label="操作" width="80">
+            <el-table-column label="操作" width="80" fixed="right">
               <template #default="{ row, $index }">
                 <el-button type="primary" link @click="handleDelete($index)">删除</el-button>
               </template>

+ 63 - 237
src/components/process/ServiceContract.vue

@@ -111,10 +111,15 @@
           </div>
         </div>
       </template>
+      <template #sellerOther>
+        <div style="width: 100%">
+          <Editor :value="formData.data.remark" @updateValue="updateContentSeller" />
+        </div>
+      </template>
       <template #commodity>
         <div style="width: 100%">
           <el-button @click="openProduct = true">添加商品</el-button>
-          <el-table :data="formData.data.contractProductList" style="width: 100%; margin-top: 16px">
+          <el-table :data="formData.data.serviceContractProductList" style="width: 100%; margin-top: 16px">
             <el-table-column label="商品图片" width="80">
               <template #default="{ row }">
                 <div v-if="row.productId">
@@ -124,10 +129,10 @@
               </template>
             </el-table-column>
             <el-table-column prop="code" label="商品编码" width="120" />
-            <el-table-column label="商品名称">
+            <el-table-column label="商品名称" min-width="200">
               <template #default="{ row, $index }">
                 <div style="width: 100%">
-                  <el-form-item :prop="'contractProductList.' + $index + '.productName'" :rules="rules.productName" :inline-message="true">
+                  <el-form-item :prop="'serviceContractProductList.' + $index + '.productName'" :rules="rules.productName" :inline-message="true">
                     <el-input v-model="row.productName" placeholder="请输入商品名称" />
                   </el-form-item>
                 </div>
@@ -136,7 +141,7 @@
             <el-table-column label="规格型号" width="180">
               <template #default="{ row, $index }">
                 <div style="width: 100%">
-                  <el-form-item :prop="'contractProductList.' + $index + '.productModel'" :rules="rules.productModel" :inline-message="true">
+                  <el-form-item :prop="'serviceContractProductList.' + $index + '.productModel'" :rules="rules.productModel" :inline-message="true">
                     <el-input v-model="row.productModel" placeholder="请输入规格型号" />
                   </el-form-item>
                 </div>
@@ -146,7 +151,7 @@
             <el-table-column label="数量" width="160">
               <template #default="{ row, $index }">
                 <div style="width: 100%">
-                  <el-form-item :prop="'contractProductList.' + $index + '.quantity'" :rules="rules.quantity" :inline-message="true">
+                  <el-form-item :prop="'serviceContractProductList.' + $index + '.quantity'" :rules="rules.quantity" :inline-message="true">
                     <el-input-number
                       v-model="row.quantity"
                       placeholder="请输入数量"
@@ -162,7 +167,7 @@
             <el-table-column label="单价" width="160">
               <template #default="{ row, $index }">
                 <div style="width: 100%">
-                  <el-form-item :prop="'contractProductList.' + $index + '.price'" :rules="rules.price" :inline-message="true">
+                  <el-form-item :prop="'serviceContractProductList.' + $index + '.price'" :rules="rules.price" :inline-message="true">
                     <el-input-number
                       v-model="row.price"
                       placeholder="请输入单价"
@@ -176,7 +181,7 @@
               </template>
             </el-table-column>
             <el-table-column prop="amount" label="金额" width="140" />
-            <el-table-column align="center" label="操作" width="120">
+            <el-table-column align="center" label="操作" width="120" fixed="right">
               <template #default="{ row, $index }">
                 <el-button type="primary" link @click="handleHandover(row, $index)">交接单</el-button>
                 <el-button type="primary" link @click="handleRemove($index)">删除</el-button>
@@ -188,11 +193,11 @@
       <template #otherCharge>
         <div style="width: 100%">
           <el-button type="primary" @click="clickAdd()">添加行</el-button>
-          <el-table :data="formData.data.contractProjectList" style="width: 100%; margin-top: 16px">
+          <el-table :data="formData.data.serviceContractPayList" style="width: 100%; margin-top: 16px">
             <el-table-column label="收费项目" width="220">
               <template #default="{ row, $index }">
                 <div style="width: 100%">
-                  <el-form-item :prop="'contractProjectList.' + $index + '.payName'" :rules="rules.payName" :inline-message="true">
+                  <el-form-item :prop="'serviceContractPayList.' + $index + '.payName'" :rules="rules.payName" :inline-message="true">
                     <el-autocomplete v-model="row.payName" :fetch-suggestions="querySearch" clearable class="inline-input w-50" placeholder="请输入收费项目" />
                   </el-form-item>
                 </div>
@@ -201,7 +206,7 @@
             <el-table-column label="金额" width="180">
               <template #default="{ row, $index }">
                 <div style="width: 100%">
-                  <el-form-item :prop="'contractProjectList.' + $index + '.amount'" :rules="rules.amount" :inline-message="true">
+                  <el-form-item :prop="'serviceContractPayList.' + $index + '.amount'" :rules="rules.amount" :inline-message="true">
                     <el-input-number
                       v-model="row.amount"
                       placeholder="请输入金额"
@@ -217,13 +222,13 @@
             <el-table-column label="备注">
               <template #default="{ row, $index }">
                 <div style="width: 100%">
-                  <el-form-item :prop="'contractProjectList.' + $index + '.remark'">
+                  <el-form-item :prop="'serviceContractPayList.' + $index + '.remark'">
                     <el-input v-model="row.remark" placeholder="请输入备注" />
                   </el-form-item>
                 </div>
               </template>
             </el-table-column>
-            <el-table-column align="center" label="操作" width="80">
+            <el-table-column align="center" label="操作" width="80" fixed="right">
               <template #default="{ row, $index }">
                 <el-button type="primary" link @click="handleDelete($index)">删除</el-button>
               </template>
@@ -246,11 +251,6 @@
                 <el-input v-model="formData.data.amount" placeholder="合同总金额" disabled />
               </el-form-item>
             </el-col>
-            <el-col :span="4">
-              <el-form-item label="报价有效期 (天)" prop="effective">
-                <el-input-number v-model="formData.data.effective" placeholder="请输入有效期" style="width: 100%" :precision="0" :controls="false" :min="0" />
-              </el-form-item>
-            </el-col>
           </el-row>
           <el-row style="margin-top: 20px; width: 100%">
             <el-col :span="7">
@@ -282,86 +282,6 @@
           </el-row>
         </div>
       </template>
-      <template #delivery>
-        <div style="width: 100%">
-          <el-row style="margin-top: 20px; width: 100%">
-            <el-col :span="7">
-              <el-form-item label="贸易方式" prop="tradeMethods">
-                <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>
-              </el-form-item>
-            </el-col>
-          </el-row>
-          <el-row style="margin-top: 20px; width: 100%">
-            <el-col :span="7">
-              <el-form-item label="运输方式" prop="transportMethod">
-                <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>
-              </el-form-item>
-            </el-col>
-            <el-col :span="7">
-              <el-form-item label="运输说明" prop="transportRemark">
-                <el-input v-model="formData.data.transportRemark" placeholder="请输入运输说明" />
-              </el-form-item>
-            </el-col>
-          </el-row>
-          <el-row style="margin-top: 20px; width: 100%">
-            <el-col :span="14">
-              <el-form-item label="付款条件" prop="remark">
-                <el-input v-model="formData.data.remark" :rows="2" type="textarea" placeholder="请输入付款条件" />
-              </el-form-item>
-            </el-col>
-          </el-row>
-          <el-row style="margin-top: 20px; width: 100%">
-            <el-col :span="7">
-              <el-form-item label="保质期 (天)" prop="warranty">
-                <el-input-number v-model="formData.data.warranty" placeholder="请输入保质期" style="width: 100%" :precision="0" :controls="false" :min="0" />
-              </el-form-item>
-            </el-col>
-          </el-row>
-        </div>
-      </template>
-      <template #shipment>
-        <div style="width: 100%">
-          <el-table :data="formData.data.contractShipmentList" style="width: 100%; margin-top: 16px">
-            <el-table-column prop="code" label="商品编码" width="120" />
-            <el-table-column prop="productName" label="商品名称" />
-            <el-table-column label="出货日期" width="220">
-              <template #default="{ row, $index }">
-                <div style="width: 100%">
-                  <el-form-item :prop="'contractShipmentList.' + $index + '.shipmentTime'" :rules="rules.shipmentTime" :inline-message="true">
-                    <el-date-picker v-model="row.shipmentTime" type="date" placeholder="请选择出货日期" value-format="YYYY-MM-DD" />
-                  </el-form-item>
-                </div>
-              </template>
-            </el-table-column>
-            <el-table-column label="数量" width="160">
-              <template #default="{ row, $index }">
-                <div style="width: 100%">
-                  <el-form-item :prop="'contractShipmentList.' + $index + '.quantity'" :rules="rules.quantity" :inline-message="true">
-                    <el-input-number
-                      v-model="row.quantity"
-                      placeholder="请输入数量"
-                      style="width: 100%"
-                      :precision="0"
-                      :controls="false"
-                      :min="0"
-                      @change="calculationAmount()" />
-                  </el-form-item>
-                </div>
-              </template>
-            </el-table-column>
-            <el-table-column align="center" label="操作" width="120">
-              <template #default="{ row, $index }">
-                <el-button type="primary" link @click="clickSplit(row)">拆分</el-button>
-                <el-button type="primary" link @click="clickDelete($index)">删除</el-button>
-              </template>
-            </el-table-column>
-          </el-table>
-        </div>
-      </template>
     </byForm>
 
     <el-dialog v-model="openProduct" title="选择商品" width="70%" append-to-body>
@@ -405,11 +325,8 @@ import { ElMessage } from "element-plus";
 import Editor from "@/components/Editor/index.vue";
 
 const { proxy } = getCurrentInstance();
-const contractType = ref([]);
 const accountCurrency = ref([]);
 const fundsPaymentMethod = ref([]);
-const tradeMethods = ref([]);
-const shippingMethod = ref([]);
 const templateList = ref([]);
 const corporationList = ref([]);
 const customerList = ref([]);
@@ -421,10 +338,10 @@ const accountList = ref([]);
 const openProduct = ref(false);
 const formData = reactive({
   data: {
+    remark: "",
     amount: undefined,
-    contractProductList: [],
-    contractProjectList: [],
-    contractShipmentList: [],
+    serviceContractProductList: [],
+    serviceContractPayList: [],
   },
 });
 const submit = ref(null);
@@ -441,20 +358,12 @@ const formConfig = computed(() => {
     },
     {
       type: "select",
-      label: "合同类型",
-      prop: "contractType",
-      data: contractType.value,
-      itemWidth: 25,
-    },
-    {
-      type: "select",
       label: "选择合同模板",
       prop: "contractTemplateId",
       data: templateList.value,
       fn: (val) => {
         changeTemplate(val);
       },
-      itemWidth: 26,
     },
     {
       type: "slot",
@@ -470,6 +379,11 @@ const formConfig = computed(() => {
     },
     {
       type: "slot",
+      slotName: "sellerOther",
+      label: "卖方信息",
+    },
+    {
+      type: "slot",
       slotName: "commodity",
       label: "商品信息",
     },
@@ -481,22 +395,11 @@ const formConfig = computed(() => {
     {
       type: "slot",
       slotName: "offerMoney",
-      label: "报价金额",
-    },
-    {
-      type: "slot",
-      slotName: "delivery",
-      label: "交付信息",
-    },
-    {
-      type: "slot",
-      slotName: "shipment",
-      label: "出货计划",
+      label: "收款信息",
     },
   ];
 });
 const rules = ref({
-  contractType: [{ required: true, message: "请选择合同类型", trigger: "change" }],
   contractTemplateId: [{ required: true, message: "请选择合同模板", trigger: "change" }],
   buyCorporationId: [{ required: true, message: "请选择公司", trigger: "change" }],
   buyCountryId: [{ required: true, message: "请选择国家", trigger: "change" }],
@@ -510,39 +413,16 @@ const rules = ref({
   quantity: [{ required: true, message: "请输入数量", trigger: "blur" }],
   amount: [{ required: true, message: "请输入金额", trigger: "blur" }],
   payName: [{ required: true, message: "请输入收费项目", trigger: ["change", "blur"] }],
-  shipmentTime: [{ required: true, message: "请选择出货日期", trigger: ["change", "blur"] }],
   currency: [{ required: true, message: "请选择币种", trigger: "change" }],
-  effective: [{ required: true, message: "请输入报价有效期", trigger: "blur" }],
   paymentMethod: [{ required: true, message: "请选择付款方式", trigger: "change" }],
   advanceRatio: [{ required: true, message: "请输入预付比例", trigger: "blur" }],
   shroffAccountId: [{ required: true, message: "请选择收款账号", trigger: "change" }],
-  tradeMethods: [{ required: true, message: "请选择贸易方式", trigger: "change" }],
-  transportMethod: [{ required: true, message: "请选择运输方式", trigger: "change" }],
-  transportRemark: [{ required: true, message: "请输入运输说明", trigger: "blur" }],
-  remark: [{ required: true, message: "请输入付款条件", trigger: "blur" }],
 });
 const getDict = () => {
   proxy
     .post("/dictTenantData/page", {
       pageNum: 1,
       pageSize: 999,
-      dictCode: "contract_type",
-      tenantId: useUserStore().user.tenantId,
-    })
-    .then((res) => {
-      if (res.rows && res.rows.length > 0) {
-        contractType.value = res.rows.map((item) => {
-          return {
-            label: item.dictValue,
-            value: item.dictKey,
-          };
-        });
-      }
-    });
-  proxy
-    .post("/dictTenantData/page", {
-      pageNum: 1,
-      pageSize: 999,
       dictCode: "account_currency",
       tenantId: useUserStore().user.tenantId,
     })
@@ -573,40 +453,6 @@ const getDict = () => {
         });
       }
     });
-  proxy
-    .post("/dictTenantData/page", {
-      pageNum: 1,
-      pageSize: 999,
-      dictCode: "trade_methods",
-      tenantId: useUserStore().user.tenantId,
-    })
-    .then((res) => {
-      if (res.rows && res.rows.length > 0) {
-        tradeMethods.value = res.rows.map((item) => {
-          return {
-            label: item.dictValue,
-            value: item.dictKey,
-          };
-        });
-      }
-    });
-  proxy
-    .post("/dictTenantData/page", {
-      pageNum: 1,
-      pageSize: 999,
-      dictCode: "shipping_method",
-      tenantId: useUserStore().user.tenantId,
-    })
-    .then((res) => {
-      if (res.rows && res.rows.length > 0) {
-        shippingMethod.value = res.rows.map((item) => {
-          return {
-            label: item.dictValue,
-            value: item.dictKey,
-          };
-        });
-      }
-    });
   proxy.post("/contractTemplate/page", { pageNum: 1, pageSize: 999 }).then((res) => {
     templateList.value = res.rows.map((item) => {
       return {
@@ -780,7 +626,7 @@ const handlePerson = (item) => {
 };
 const pushGoods = (goods) => {
   if (goods && goods.length > 0) {
-    formData.data.contractProductList = formData.data.contractProductList.concat(
+    formData.data.serviceContractProductList = formData.data.serviceContractProductList.concat(
       goods.map((item) => {
         let fileUrl = "";
         if (item.fileList && item.fileList.length > 0) {
@@ -801,17 +647,6 @@ const pushGoods = (goods) => {
         };
       })
     );
-    formData.data.contractShipmentList = formData.data.contractShipmentList.concat(
-      goods.map((item) => {
-        return {
-          code: item.code,
-          productId: item.id,
-          productName: item.name,
-          shipmentTime: "",
-          quantity: undefined,
-        };
-      })
-    );
     ElMessage({
       message: "添加成功!",
       type: "success",
@@ -888,6 +723,9 @@ const handleHandover = (row, index) => {
 const updateContent = (val) => {
   productRow.data.remark = val;
 };
+const updateContentSeller = (val) => {
+  formData.data.remark = val;
+};
 const uploadFile = async (file) => {
   const res = await proxy.post("/fileInfo/getSing", { fileName: file.name });
   uploadData.value = res.uploadBody;
@@ -900,34 +738,34 @@ const onPreviewFile = (file) => {
   window.open(file.raw.fileUrl, "_blank");
 };
 const submitHandoverForm = () => {
+  formData.data.serviceContractProductList[productIndex.value].remark = productRow.data.remark;
   if (fileList.value && fileList.value.length > 0) {
-    formData.data.contractProductList[productIndex.value].remark = productRow.data.remark;
-    if (fileList.value && fileList.value.length > 0) {
-      formData.data.contractProductList[productIndex.value].fileList = fileList.value.map((item) => {
-        return {
-          id: item.raw.id,
-          fileName: item.raw.fileName,
-          fileUrl: item.raw.fileUrl,
-        };
-      });
-    } else {
-      formData.data.contractProductList[productIndex.value].fileList = [];
-    }
-    openHandover.value = false;
+    formData.data.serviceContractProductList[productIndex.value].fileList = fileList.value.map((item) => {
+      return {
+        id: item.raw.id,
+        fileName: item.raw.fileName,
+        fileUrl: item.raw.fileUrl,
+      };
+    });
+  } else {
+    formData.data.serviceContractProductList[productIndex.value].fileList = [];
   }
+  openHandover.value = false;
 };
 const handleRemove = (index) => {
-  formData.data.contractProductList.splice(index, 1);
+  formData.data.serviceContractProductList.splice(index, 1);
 };
 const calculationAmount = () => {
   nextTick(() => {
-    if (formData.data.contractProductList && formData.data.contractProductList.length > 0) {
-      for (let i = 0; i < formData.data.contractProductList.length; i++) {
+    if (formData.data.serviceContractProductList && formData.data.serviceContractProductList.length > 0) {
+      for (let i = 0; i < formData.data.serviceContractProductList.length; i++) {
         let money = 0;
-        if (formData.data.contractProductList[i].quantity && formData.data.contractProductList[i].price) {
-          money = parseFloat(Number(formData.data.contractProductList[i].quantity) * Number(formData.data.contractProductList[i].price)).toFixed(2);
+        if (formData.data.serviceContractProductList[i].quantity && formData.data.serviceContractProductList[i].price) {
+          money = parseFloat(Number(formData.data.serviceContractProductList[i].quantity) * Number(formData.data.serviceContractProductList[i].price)).toFixed(
+            2
+          );
         }
-        formData.data.contractProductList[i].amount = money;
+        formData.data.serviceContractProductList[i].amount = money;
       }
     }
     nextTick(() => {
@@ -937,34 +775,34 @@ const calculationAmount = () => {
 };
 const totalAmount = () => {
   let money = 0;
-  if (formData.data.contractProductList && formData.data.contractProductList.length > 0) {
-    for (let i = 0; i < formData.data.contractProductList.length; i++) {
-      if (formData.data.contractProductList[i].amount) {
-        money = parseFloat(Number(money) + Number(formData.data.contractProductList[i].amount)).toFixed(2);
+  if (formData.data.serviceContractProductList && formData.data.serviceContractProductList.length > 0) {
+    for (let i = 0; i < formData.data.serviceContractProductList.length; i++) {
+      if (formData.data.serviceContractProductList[i].amount) {
+        money = parseFloat(Number(money) + Number(formData.data.serviceContractProductList[i].amount)).toFixed(2);
       }
     }
   }
-  if (formData.data.contractProjectList && formData.data.contractProjectList.length > 0) {
-    for (let i = 0; i < formData.data.contractProjectList.length; i++) {
-      if (formData.data.contractProjectList[i].amount) {
-        money = parseFloat(Number(money) + Number(formData.data.contractProjectList[i].amount)).toFixed(2);
+  if (formData.data.serviceContractPayList && formData.data.serviceContractPayList.length > 0) {
+    for (let i = 0; i < formData.data.serviceContractPayList.length; i++) {
+      if (formData.data.serviceContractPayList[i].amount) {
+        money = parseFloat(Number(money) + Number(formData.data.serviceContractPayList[i].amount)).toFixed(2);
       }
     }
   }
   formData.data.amount = money;
 };
 const clickAdd = () => {
-  if (formData.data.contractProjectList && formData.data.contractProjectList.length > 0) {
-    formData.data.contractProjectList.push({ payName: "", amount: undefined, remark: "" });
+  if (formData.data.serviceContractPayList && formData.data.serviceContractPayList.length > 0) {
+    formData.data.serviceContractPayList.push({ payName: "", amount: undefined, remark: "" });
   } else {
-    formData.data.contractProjectList = [{ payName: "", amount: undefined, remark: "" }];
+    formData.data.serviceContractPayList = [{ payName: "", amount: undefined, remark: "" }];
   }
 };
 const handleDelete = (index) => {
-  formData.data.contractProjectList.splice(index, 1);
+  formData.data.serviceContractPayList.splice(index, 1);
 };
 const querySearch = (queryString, callback) => {
-  proxy.post("/quotationPay/page", { payName: queryString }).then((res) => {
+  proxy.post("/serviceContractPay/page", { payName: queryString }).then((res) => {
     if (res.rows && res.rows.length > 0) {
       res.rows = res.rows.map((item) => {
         return {
@@ -978,22 +816,10 @@ const querySearch = (queryString, callback) => {
     }
   });
 };
-const clickSplit = (item) => {
-  formData.data.contractShipmentList.push({
-    code: item.code,
-    productId: item.productId,
-    productName: item.productName,
-    shipmentTime: "",
-    quantity: undefined,
-  });
-};
-const clickDelete = (index) => {
-  formData.data.contractShipmentList.splice(index, 1);
-};
 const handleSubmit = async () => {
   let status = await submit.value.handleSubmit(() => {});
   if (status) {
-    if (formData.data.contractProductList && formData.data.contractProductList.length > 0) {
+    if (formData.data.serviceContractProductList && formData.data.serviceContractProductList.length > 0) {
       return true;
     } else {
       ElMessage("请添加至少一件商品");

+ 105 - 0
src/views/finance/fundManage/statistics/index.vue

@@ -0,0 +1,105 @@
+<template>
+  <div class="tenant">
+    <el-form :inline="true" :model="sourceList.pagination" class="demo-form-inline">
+      <el-form-item label="起止时间:">
+        <el-col :span="11">
+          <el-date-picker
+            type="month"
+            placeholder="选择开始月份"
+            v-model="sourceList.pagination.beginTime"
+            value-format="YYYY-MM"
+            style="width: 100%"
+            @change="getList"></el-date-picker>
+        </el-col>
+        <el-col class="line" :span="2" style="text-align: center">至</el-col>
+        <el-col :span="11">
+          <el-date-picker
+            type="month"
+            placeholder="选择结束月份"
+            v-model="sourceList.pagination.endTime"
+            value-format="YYYY-MM"
+            style="width: 100%"
+            @change="getList"></el-date-picker>
+        </el-col>
+      </el-form-item>
+      <el-form-item label="部门:" prop="deptId">
+        <el-tree-select
+          v-model="sourceList.pagination.deptId"
+          :data="deptList"
+          :render-after-expand="false"
+          check-strictly
+          :node-key="'deptId'"
+          :props="defaultProps" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" @click="getList">搜索</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-table :data="sourceList.data" style="width: 100%">
+      <el-table-column prop="date" label="部门" width="180" />
+      <el-table-column prop="name" label="Name" width="180" />
+      <el-table-column prop="address" label="Address" />
+    </el-table>
+  </div>
+</template>
+
+<script setup>
+import { ref } from "vue";
+import useUserStore from "@/store/modules/user";
+import moment from "moment";
+import * as date from "@/utils/date.js";
+
+const { proxy } = getCurrentInstance();
+const deptList = ref([]);
+const sourceList = ref({
+  data: [],
+  pagination: {
+    total: 0,
+    pageNum: 1,
+    pageSize: 10,
+    beginTime: moment().format("yyyy") + '-01',
+    endTime: moment().format("yyyy") + '-12',
+    deptId: "",
+  },
+});
+const defaultProps = {
+  children: "children",
+  label: "deptName",
+};
+const loading = ref(false);
+const getDict = () => {
+  proxy
+    .get("/tenantDept/list", {
+      pageNum: 1,
+      pageSize: 999,
+      tenantId: useUserStore().user.tenantId,
+    })
+    .then((res) => {
+      deptList.value = proxy.handleTree(res.data, "deptId");
+    });
+};
+const getList = async () => {
+  loading.value = true;
+  proxy.post("/accountDeptRunningWater/DeptRunningWaterReport", sourceList.value.pagination).then((res) => {
+    sourceList.value.data = res.rows;
+    sourceList.value.pagination.total = res.total;
+    setTimeout(() => {
+      loading.value = false;
+    }, 200);
+  });
+};
+getDict();
+getList();
+</script>
+
+<style lang="scss" scoped>
+.tenant {
+  margin: 20px;
+  padding: 20px;
+  background: #fff;
+}
+::v-deep(.el-input-number .el-input__inner) {
+  text-align: left;
+}
+</style>

+ 11 - 7
src/views/salesMange/saleContract/contract/index.vue

@@ -21,10 +21,10 @@
             <span>{{ moneyFormat(item.amount, 2) }}</span>
           </div>
         </template>
-        <template #aaaaa="{ item }">
+        <template #refundMoney="{ item }">
           <div>
-            <!-- <span style="padding-right: 4px">{{ item.currency }}</span>
-            <span>{{ moneyFormat(item.amount, 2) }}</span> -->
+            <span style="padding-right: 4px">{{ item.currency }}</span>
+            <span>{{ moneyFormat(item.refundMoney, 2) }}</span>
           </div>
         </template>
         <template #advanceRatio="{ item }">
@@ -120,6 +120,7 @@ const config = computed(() => {
       attrs: {
         label: "归属公司",
         prop: "sellCorporationId",
+        "min-width": 220,
       },
       render(type) {
         let text = "";
@@ -136,6 +137,7 @@ const config = computed(() => {
       attrs: {
         label: "合同类型",
         prop: "contractType",
+        width: 120,
       },
       render(type) {
         let text = "";
@@ -159,6 +161,7 @@ const config = computed(() => {
       attrs: {
         label: "客户",
         prop: "buyCorporationId",
+        "min-width": 220,
       },
       render(type) {
         let text = "";
@@ -188,7 +191,7 @@ const config = computed(() => {
     {
       attrs: {
         label: "已到账金额",
-        slot: "aaaaa",
+        slot: "refundMoney",
         width: 140,
       },
     },
@@ -228,6 +231,7 @@ const config = computed(() => {
         label: "操作",
         width: "120",
         align: "center",
+        fixed: "right",
       },
       renderHTML(row) {
         return [
@@ -251,7 +255,7 @@ const config = computed(() => {
                   })
                   .then(() => {
                     ElMessage({
-                      message: "删除成功",
+                      message: "作废成功",
                       type: "success",
                     });
                     getList();
@@ -304,7 +308,7 @@ const getDict = () => {
 const getList = async (req) => {
   sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
   loading.value = true;
-  proxy.post("/pay/page", sourceList.value.pagination).then((res) => {
+  proxy.post("/contract/page", sourceList.value.pagination).then((res) => {
     sourceList.value.data = res.rows;
     sourceList.value.pagination.total = res.total;
     setTimeout(() => {
@@ -319,7 +323,7 @@ const newContract = () => {
     path: "/platform_manage/process/processApproval",
     query: {
       flowKey: "contract_flow",
-      flowName: "销合同审批流程",
+      flowName: "销合同审批流程",
     },
   });
 };

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

@@ -100,6 +100,7 @@ const config = computed(() => {
       attrs: {
         label: "归属公司",
         prop: "sellCorporationId",
+        "min-width": 220,
       },
       render(type) {
         let text = "";
@@ -130,6 +131,7 @@ const config = computed(() => {
       attrs: {
         label: "客户名称",
         prop: "buyCorporationId",
+        "min-width": 220,
       },
       render(type) {
         let text = "";
@@ -178,6 +180,7 @@ const config = computed(() => {
         label: "操作",
         width: "120",
         align: "center",
+        fixed: "right",
       },
       renderHTML(row) {
         return [

+ 261 - 68
src/views/salesMange/saleContract/serviceContract/index.vue

@@ -10,7 +10,7 @@
         highlight-current-row
         :action-list="[
           {
-            text: '创建合同',
+            text: '新增合同',
             action: () => newContract(),
           },
         ]"
@@ -21,10 +21,10 @@
             <span>{{ moneyFormat(item.amount, 2) }}</span>
           </div>
         </template>
-        <template #aaaaa="{ item }">
+        <template #claimAmount="{ item }">
           <div>
-            <!-- <span style="padding-right: 4px">{{ item.currency }}</span>
-            <span>{{ moneyFormat(item.amount, 2) }}</span> -->
+            <span style="padding-right: 4px">{{ item.currency }}</span>
+            <span>{{ moneyFormat(item.claimAmount, 2) }}</span>
           </div>
         </template>
         <template #advanceRatio="{ item }">
@@ -34,25 +34,69 @@
         </template>
       </byTable>
     </div>
+
+    <el-dialog title="服务记录" v-if="dialogVisible" v-model="dialogVisible" width="800" v-loading="loadingDialog">
+      <div style="margin-bottom: 20px">
+        <el-button type="primary" @click="clickAddRecord" plain>添加服务记录</el-button>
+      </div>
+      <el-timeline>
+        <el-timeline-item v-for="(activity, index) in activities" :key="index" :timestamp="activity.timestamp">
+          {{ activity.content }}
+        </el-timeline-item>
+      </el-timeline>
+      <div style="padding: 16px; text-align: center">
+        <el-button @click="dialogVisible = false" size="large">关 闭</el-button>
+      </div>
+    </el-dialog>
+
+    <el-dialog title="服务记录" v-if="openAddRecord" v-model="openAddRecord" width="700" v-loading="loadingRecord">
+      <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="submit">
+        <template #serviceTime>
+          <div>
+            <el-date-picker v-model="formData.data.serviceTime" type="datetime" placeholder="请选择服务时间" value-format="YYYY-MM-DD HH:mm:ss" />
+          </div>
+        </template>
+        <template #remark>
+          <div style="width: 100%">
+            <Editor :value="formData.data.remark" @updateValue="updateContent" />
+          </div>
+        </template>
+        <template #file>
+          <div style="width: 100%">
+            <el-upload
+              v-model:fileList="fileList"
+              action="https://winfaster.obs.cn-south-1.myhuaweicloud.com"
+              :data="uploadData"
+              multiple
+              :before-upload="uploadFile"
+              :on-preview="onPreviewFile">
+              <el-button>选择</el-button>
+            </el-upload>
+          </div>
+        </template>
+      </byForm>
+      <template #footer>
+        <el-button @click="openAddRecord = false" size="large">取 消</el-button>
+        <el-button type="primary" @click="submitForm()" size="large">确 定</el-button>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
 <script setup>
 import { computed, ref } from "vue";
 import byTable from "@/components/byTable/index";
-import useUserStore from "@/store/modules/user";
 import { ElMessage, ElMessageBox } from "element-plus";
+import byForm from "@/components/byForm/index";
+import useUserStore from "@/store/modules/user";
+import Editor from "@/components/Editor/index.vue";
 
 const { proxy } = getCurrentInstance();
-const contractType = ref([]);
 const corporationList = ref([]);
 const customerList = ref([]);
+const userList = ref([]);
 const status = ref([
   {
-    label: "草稿",
-    value: 0,
-  },
-  {
     label: "审批中",
     value: 10,
   },
@@ -65,21 +109,17 @@ const status = ref([
     value: 30,
   },
   {
-    label: "终止",
-    value: 99,
+    label: "作废",
+    value: 999,
   },
 ]);
-const refundStatus = ref([
-  {
-    label: "未到款",
-    value: 0,
-  },
+const serviceStatus = ref([
   {
-    label: "部分到款",
+    label: "服务中",
     value: 10,
   },
   {
-    label: "已到款",
+    label: "已完结",
     value: 20,
   },
 ]);
@@ -91,7 +131,7 @@ const sourceList = ref({
     pageSize: 10,
     keyword: "",
     status: "",
-    sellCorporationId: "",
+    serviceStatus: "",
   },
 });
 const loading = ref(false);
@@ -103,15 +143,10 @@ const selectConfig = computed(() => {
       data: status.value,
     },
     {
-      label: "到款状态",
-      prop: "refundStatus",
-      data: refundStatus.value,
+      label: "服务状态",
+      prop: "serviceStatus",
+      data: serviceStatus.value,
     },
-    // {
-    //   label: "归属公司",
-    //   prop: "sellCorporationId",
-    //   data: corporationList.value,
-    // },
   ];
 });
 const config = computed(() => {
@@ -120,6 +155,7 @@ const config = computed(() => {
       attrs: {
         label: "归属公司",
         prop: "sellCorporationId",
+        "min-width": 220,
       },
       render(type) {
         let text = "";
@@ -134,22 +170,6 @@ const config = computed(() => {
     },
     {
       attrs: {
-        label: "合同类型",
-        prop: "contractType",
-      },
-      render(type) {
-        let text = "";
-        if (contractType.value && contractType.value.length > 0) {
-          let data = contractType.value.filter((item) => item.value == type);
-          if (data && data.length > 0) {
-            text = data[0].label;
-          }
-        }
-        return text;
-      },
-    },
-    {
-      attrs: {
         label: "合同编码",
         prop: "code",
         width: 180,
@@ -159,6 +179,7 @@ const config = computed(() => {
       attrs: {
         label: "客户",
         prop: "buyCorporationId",
+        "min-width": 220,
       },
       render(type) {
         let text = "";
@@ -188,7 +209,7 @@ const config = computed(() => {
     {
       attrs: {
         label: "已到账金额",
-        slot: "aaaaa",
+        slot: "claimAmount",
         width: 140,
       },
     },
@@ -225,9 +246,27 @@ const config = computed(() => {
     },
     {
       attrs: {
+        label: "到款状态",
+        prop: "serviceStatus",
+        width: 140,
+      },
+      render(type) {
+        let text = "";
+        if (serviceStatus.value && serviceStatus.value.length > 0) {
+          let data = serviceStatus.value.filter((item) => item.value == type);
+          if (data && data.length > 0) {
+            text = data[0].label;
+          }
+        }
+        return text;
+      },
+    },
+    {
+      attrs: {
         label: "操作",
-        width: "120",
+        width: "140",
         align: "center",
+        fixed: "right",
       },
       renderHTML(row) {
         return [
@@ -245,13 +284,13 @@ const config = computed(() => {
                 type: "warning",
               }).then(() => {
                 proxy
-                  .post("/contract/edit", {
+                  .post("/serviceContract/cancel", {
                     id: row.id,
                     status: 88,
                   })
                   .then(() => {
                     ElMessage({
-                      message: "删除成功",
+                      message: "作废成功",
                       type: "success",
                     });
                     getList();
@@ -259,29 +298,23 @@ const config = computed(() => {
               });
             },
           },
+          {
+            attrs: {
+              label: "服务记录",
+              type: "primary",
+              text: true,
+            },
+            el: "button",
+            click() {
+              clickRecord(row);
+            },
+          },
         ];
       },
     },
   ];
 });
 const getDict = () => {
-  proxy
-    .post("/dictTenantData/page", {
-      pageNum: 1,
-      pageSize: 999,
-      dictCode: "contract_type",
-      tenantId: useUserStore().user.tenantId,
-    })
-    .then((res) => {
-      if (res.rows && res.rows.length > 0) {
-        contractType.value = res.rows.map((item) => {
-          return {
-            label: item.dictValue,
-            value: item.dictKey,
-          };
-        });
-      }
-    });
   proxy.post("/corporation/page", { pageNum: 1, pageSize: 999 }).then((res) => {
     corporationList.value = res.rows.map((item) => {
       return {
@@ -300,11 +333,19 @@ const getDict = () => {
       };
     });
   });
+  proxy.get("/tenantUser/list", { pageNum: 1, pageSize: 10000, tenantId: useUserStore().user.tenantId }).then((res) => {
+    userList.value = res.rows.map((item) => {
+      return {
+        label: item.userName,
+        value: item.userId,
+      };
+    });
+  });
 };
 const getList = async (req) => {
   sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
   loading.value = true;
-  proxy.post("/pay/page", sourceList.value.pagination).then((res) => {
+  proxy.post("/serviceContract/page", sourceList.value.pagination).then((res) => {
     sourceList.value.data = res.rows;
     sourceList.value.pagination.total = res.total;
     setTimeout(() => {
@@ -318,11 +359,163 @@ const newContract = () => {
   proxy.$router.replace({
     path: "/platform_manage/process/processApproval",
     query: {
-      flowKey: "contract_flow",
-      flowName: "外销合同审批流程",
+      flowKey: "service_contract_flow",
+      flowName: "服务合同审批流程",
     },
   });
 };
+const submit = ref(null);
+const dialogVisible = ref(false);
+const loadingDialog = ref(false);
+const openAddRecord = ref(false);
+const activities = [
+  {
+    content: "Event start",
+    timestamp: "2018-04-15",
+  },
+  {
+    content: "Approved",
+    timestamp: "2018-04-13",
+  },
+  {
+    content: "Success",
+    timestamp: "2018-04-11",
+  },
+];
+const getRecordList = () => {
+  proxy.post("/serviceContractRecord/page", { serviceContractId: formData.data.serviceContractId }).then((res) => {
+    console.log(res);
+    
+    // proxy.post("/fileInfo/getList", { businessIdList: [row.id] }).then((res) => {
+    //   if (res[row.id] && res[row.id].length > 0) {
+    //     fileList.value = res[row.id].map((item) => {
+    //       return {
+    //         raw: item,
+    //         name: item.fileName,
+    //         url: item.fileUrl,
+    //       };
+    //     });
+    //   }
+    // });
+    loadingDialog.value = false;
+  });
+};
+const clickRecord = (item) => {
+  formData.data.serviceContractId = item.id;
+  loadingDialog.value = true;
+  dialogVisible.value = true;
+  getRecordList();
+};
+const formOption = reactive({
+  inline: true,
+  labelWidth: 100,
+  itemWidth: 100,
+  rules: [],
+});
+const formData = reactive({
+  data: {
+    serviceContractId: "",
+    remark: "",
+    fileList: [],
+  },
+});
+const formConfig = computed(() => {
+  return [
+    {
+      label: "账户信息",
+    },
+    {
+      type: "select",
+      prop: "userId",
+      label: "服务人员",
+      data: userList.value,
+    },
+    {
+      type: "slot",
+      prop: "serviceTime",
+      slotName: "serviceTime",
+      label: "服务时间",
+    },
+    {
+      type: "select",
+      prop: "status",
+      label: "服务状态",
+      data: serviceStatus.value,
+    },
+    {
+      type: "slot",
+      prop: "remark",
+      slotName: "remark",
+      label: "服务记录",
+    },
+    {
+      type: "slot",
+      prop: "file",
+      slotName: "file",
+      label: "上传附件",
+    },
+  ];
+});
+const rules = ref({
+  userId: [{ required: true, message: "请选择服务人员", trigger: "change" }],
+  serviceTime: [{ required: true, message: "请选择服务时间", trigger: "change" }],
+  status: [{ required: true, message: "请选择服务状态", trigger: "change" }],
+  remark: [{ required: true, message: "请输入服务记录", trigger: "blur" }],
+});
+const fileList = ref([]);
+const uploadData = ref({});
+const loadingRecord = ref(false);
+const clickAddRecord = () => {
+  formData.data = {
+    serviceContractId: formData.data.serviceContractId,
+    remark: "",
+    fileList: [],
+  };
+  loadingRecord.value = false;
+  openAddRecord.value = true;
+};
+const updateContent = (val) => {
+  formData.data.remark = val;
+};
+const uploadFile = async (file) => {
+  const res = await proxy.post("/fileInfo/getSing", { fileName: file.name });
+  uploadData.value = res.uploadBody;
+  file.id = res.id;
+  file.fileName = res.fileName;
+  file.fileUrl = res.fileUrl;
+  return true;
+};
+const onPreviewFile = (file) => {
+  window.open(file.raw.fileUrl, "_blank");
+};
+const submitForm = () => {
+  submit.value.handleSubmit(() => {
+    if (fileList.value && fileList.value.length > 0) {
+      formData.data.fileList = fileList.value.map((item) => {
+        return {
+          id: item.raw.id,
+          fileName: item.raw.fileName,
+          fileUrl: item.raw.fileUrl,
+        };
+      });
+    }
+    loadingRecord.value = true;
+    proxy.post("/serviceContractRecord/add", formData.data).then(
+      () => {
+        ElMessage({
+          message: "添加成功",
+          type: "success",
+        });
+        openAddRecord.value = false;
+        getRecordList();
+      },
+      (err) => {
+        console.log(err);
+        loadingRecord.value = false;
+      }
+    );
+  });
+};
 </script>
 
 <style lang="scss" scoped>