Browse Source

feat: 协议信息电子协议信息编辑功能80%

Signed-off-by: tangshizhe <48740614+tangshizhe@users.noreply.github.com>
tangshizhe 3 months ago
parent
commit
d6bb7e1725

+ 2 - 41
src/store/order.js

@@ -16,9 +16,8 @@ import { getRandomString } from '@/utils/utils'
 import { cloneDeep } from "lodash"
 import { showMessage, showNotify } from '@/views/create-order/hooks/toast'
 import { add, sub, calcDiscountRate } from '@/utils/number'
-import { productKeyMap } from '@/views/create-order/data'
 import { defaultPageFormValue, OrderProductCardItem } from '@/views/create-order/data/interface'
-import { findUserInDeptTree } from "@/views/create-order/hooks/utils"
+import { findUserInDeptTree, calcShowOnlineContractForm } from "@/views/create-order/hooks/utils"
 
 const defaultOrderInfo = {
   disabled: false, // 禁用
@@ -189,45 +188,7 @@ export default {
     },
     // 是否显示电子协议订单
     showOnlineContractForm(state, getters) {
-      const paybackCompanyCheck = state.pageForm.signUnit == 'h01' // 签约主体为:北京剑鱼信息技术有限公司/h01
-      const contractStatusCheck = state.pageForm.agreeStatus === 1 // 协议状态为签协议
-      // 4.支持线上生成电子协议:
-      // (1)签约主体为“北京剑鱼信息技术有限公司”;
-      // (2)仅有1个产品销售策略为“售卖”;
-      const productLength = getters.userProductInfoList.length
-      let productCheck = false
-      if (productLength === 1) {
-        const productForm = getters.userProductInfoList[0]
-        const productSpec = productForm?.productSpecification
-        const productCode = productForm?.productCode
-        const passMap = {
-          svip: false,
-          bigmember: false
-        }
-
-        const payment = productForm?.paymentType
-        // 售卖
-        const giftPass = productForm.saleGifts === 1
-
-        // 1. 超级订阅:(且付费类型为“购买”、“续费”)
-        const vipSalePass = [1, 2].includes(payment)
-        const vipSpecPass = productCode === productKeyMap.cjdy
-        passMap.svip = giftPass && vipSalePass && vipSpecPass
-
-        // 2. 大会员:售卖 && 购买/续费/试用
-        const bigSalePass = [1, 2, 4].includes(payment)
-        // 6:dyh002:商机版2.0、7:dyh003:专家版2.30190:dyh004:商机版2.0(单省版)
-        // 以上几种才可以创建电子协议
-        const bigPassProductTypeArr = ['dyh002', 'dyh003', 'dyh004']
-        const bigmemberSpecPass = bigPassProductTypeArr.includes(productSpec)
-        passMap.bigmember = giftPass && bigSalePass && bigmemberSpecPass
-
-        // 满足任一产品条件即可:找个一个true就返回true
-        productCheck = Object.values(passMap).includes(true)
-      }
-      // (3)且销售策略为“售卖”的产品规格及购买主体有配置电子协议模板;
-      // 销售策略为“售卖”的产品规格付费类型为“购买”、“续费”、“试用”。
-      return paybackCompanyCheck && contractStatusCheck && productCheck
+      return calcShowOnlineContractForm(state.pageForm, getters.userProductInfoList)
     },
   },
   mutations: {

+ 34 - 9
src/views/create-order/components/order-detail-submodule/ContractInfo.vue

@@ -21,7 +21,7 @@
       <template #title>
         <div class="contract-info-card-title">
           <span>协议归档信息</span>
-          <button @click="editContractArchive('1')" v-if="contractRes?.contract_archive_status !== 1" class="edit-btn">编辑</button>
+          <button @click="editContractArchive('1')" v-if="contractRes?.contract_archive_status === 1" class="edit-btn">编辑</button>
         </div>
       </template>
       <div class="contract-info-card">
@@ -34,12 +34,12 @@
         <div class="contract-info-card-item" v-if="contractRes?.contract_archive_status === 1">
           归档份数:{{ contractRes?.contract_archive_num || '-'  }}
         </div>
-        <div class="contract-info-card-item" v-if="contractRes?.contract_archive_status === 1">
-          归档协议:{{ contractRes?.contract_file_url || '-'  }}
+        <div class="contract-info-card-item" @click="viewfileEvent" v-if="contractRes?.contract_archive_status === 1">
+          归档协议:<span class="column-cell">{{ contractRes?.contract_file_name || '-'  }}</span>
         </div>
       </div>
     </InfoCard>
-    <InfoCard v-if="contractResStatus">
+    <InfoCard v-if="getOnlineContractFormShow">
       <template #title>
         <div class="contract-info-card-title">
           <span>电子协议信息</span>
@@ -83,10 +83,11 @@
       @cancel="editContractArchiveDialogVisible = false"
       @confirm="editContractArchiveConfirm"
     >
-      <contractInfoModule
-        :contractRes="contractRes"
+      <EditContractInfo
+        :orderDetail="orderDetail"
         :isAdmin="isAdmin"
-      ></contractInfoModule>
+        :contractFeedbackInfo="contractFeedbackInfo"
+      ></EditContractInfo>
     </Dialog>
     <newDetailModel :orderDetail="orderDetail?.orderData" ref="detailModelContract"></newDetailModel>
   </div>
@@ -95,15 +96,17 @@
 <script>
 import InfoCard from '../../ui/InfoCard.vue';
 import { signUnitOptions } from '@/views/create-order/data/index.js'
-import contractInfoModule from '../contractInfoModule.vue';
+import EditContractInfo from './EditContractInfo.vue';
 import Dialog from '@/components/Dialog.vue';
 import newDetailModel from '../newDetailModel.vue';
+import { sortOrderInfo } from '@/views/create-order/components/schema-form/resort/'
+import { calcShowOnlineContractForm } from "@/views/create-order/hooks/utils"
 export default {
   name: 'ContractInfo',
   components: {
     InfoCard,
     newDetailModel,
-    contractInfoModule,
+    EditContractInfo,
     Dialog,
     
   },
@@ -135,9 +138,18 @@ export default {
       editContractArchiveDialogVisible: false,
       protocolArchivingDialogVisible: false,
       contractRes: this.orderDetail?.contractRes || {},
+      contractFeedbackInfo: {}
     }
   },
+  mounted() {
+    this.contractFeedbackInfo = sortOrderInfo(this.orderDetail)
+    this.getOnlineContractFormShow(this.contractFeedbackInfo.pageFormValue, this.contractFeedbackInfo.productArr) 
+  },
   methods: {
+    // 是否显示电子协议订单
+    getOnlineContractFormShow(pageForm, pList) {
+      return calcShowOnlineContractForm(pageForm, pList)
+    },
     editContractArchive(type) {
       // userIdentity 1超级管理员 2销管
       if(this.isAdmin) {
@@ -155,6 +167,14 @@ export default {
     editContractArchiveConfirm() {
       // this.$refs.editContractArchiveDialog.close() 
     },
+    // 查看归档协议
+    viewfileEvent() {
+      const url = this.contractRes?.contract_file_url;
+      if(url) {
+        const urls = this.$router.resolve(url)
+        window.open(urls.href, '_blank')
+      }
+    },
     // 设置红冲标识显示字段
     setRedPunchDisplay(product) { 
       const { isUpCommission, isUpEnt, isUpCash } = this.orderDetail?.redPunchData || {};
@@ -236,4 +256,9 @@ export default {
     }
     
   }
+.column-cell {
+  color: $color_main;
+  cursor: pointer;
+  text-decoration: underline;
+}
 </style>

+ 253 - 0
src/views/create-order/components/order-detail-submodule/EditContractInfo.vue

@@ -0,0 +1,253 @@
+<template>
+  <!-- 签约信息 -->
+  <el-form ref="form" :model="pageForm" :rules="rules" label-width="126px" class="edit-contract-info">
+    <template v-if="showXieYi">
+      <el-row :gutter="2">
+        <el-col :span="12">
+          <el-form-item label="协议签订时间" prop="signTime">
+            <el-date-picker
+              :value="pageForm.signTime"
+              @input="onChangeFormItem('signTime', $event)"
+              value-format="timestamp"
+              type="date"
+              size="medium"
+              placeholder="请选择协议签订时间">
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="协议编号" prop="signCode" v-if="showSingCode">
+            <el-input
+              :value="pageForm.signCode"
+              @input="onChangeFormItem('signCode', $event)"
+              placeholder="请输入协议编号"
+              size="medium"
+              maxlength="40"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      
+      <ElOnlineContractForm
+        ref="onlineContractFormRef"
+        v-if="showOnlineContractForm"
+        :showMore="showMore && showOnlineContractForm"
+        :buySubject="buySubject"
+        :orderEntName="companyName"
+        :e_contract_type="pageForm.e_contract_type"
+        @update:e_contract_type="onChangeFormItem('e_contract_type', $event)"
+        :e_contract_userA_type="pageForm.e_contract_userA_type"
+        @update:e_contract_userA_type="onChangeFormItem('e_contract_userA_type', $event)"
+        :e_contract_userA_name="pageForm.e_contract_userA_name"
+        @update:e_contract_userA_name="onChangeFormItem('e_contract_userA_name', $event)"
+        :e_contract_userA_contacts_name="pageForm.e_contract_userA_contacts_name"
+        @update:e_contract_userA_contacts_name="onChangeFormItem('e_contract_userA_contacts_name', $event)"
+        :e_contract_userA_contacts_tel="pageForm.e_contract_userA_contacts_tel"
+        @update:e_contract_userA_contacts_tel="onChangeFormItem('e_contract_userA_contacts_tel', $event)"
+        :e_contract_userA_contacts_address="pageForm.e_contract_userA_contacts_address"
+        @update:e_contract_userA_contacts_address="onChangeFormItem('e_contract_userA_contacts_address', $event)"
+        :e_contract_userB_contacts_name="pageForm.e_contract_userB_contacts_name"
+        @update:e_contract_userB_contacts_name="onChangeFormItem('e_contract_userB_contacts_name', $event)"
+        :e_contract_remark="pageForm.e_contract_remark"
+        @update:e_contract_remark="onChangeFormItem('e_contract_remark', $event)"
+      />
+
+      <el-divider v-if="showOnlineContractForm">
+        <el-button
+          type="text"
+          :icon="this.showMore ? 'el-icon-arrow-up' : 'el-icon-arrow-down'"
+          @click="showMoreForm">更多信息</el-button>
+      </el-divider>
+    </template>
+  </el-form>
+</template>
+
+<script>
+import ElOnlineContractForm from '@/views/create-order/components/product-info-submodule/ElOnlineContractForm'
+import { selectorVModelMixin } from '@/utils/mixins/selector-v-model'
+import { calcShowOnlineContractForm } from "@/views/create-order/hooks/utils"
+
+
+export default {
+  name: 'EditContractInfo',
+  mixins: [selectorVModelMixin],
+  components: {
+    ElOnlineContractForm,
+  },
+  props: {
+    orderDetail: {
+      type: Object,
+      default: () => {
+        return {}
+      }
+    },
+    contractFeedbackInfo: {
+      type: Object,
+      default: () => {
+        return {}
+      }
+    }
+  },
+  data() {
+    return {
+      showOnlineContractForm: false,
+      required: {
+        agreeStatus: true,
+      },
+      form: {
+        // agreeStatus: 1,
+        // signUnit: 'h01',
+        // signTime: '',
+        // signCode: '',
+        signRemark: '',
+        signType: '2',
+      },
+      showMoreXieYi: true,
+      pageForm: {
+        agreeStatus: 1,
+        signTime: '',
+        signCode: '',
+        signRemark: '',
+        signType: '2',
+        contract_archive_status: 1, // 电子协议归档状态 1归档 2未归档
+        e_contract_type: 1, // 电子协议类型
+        e_contract_userA_type: 1, // 协议甲方类型
+        e_contract_userA_name: '', // 协议甲方
+        e_contract_userA_contacts_name: '', // 协议甲方联系人
+        e_contract_userA_contacts_tel: '', // 协议甲方联系方式
+        e_contract_userA_contacts_address: '', // 协议甲方联系地址
+        e_contract_userB_contacts_name: '', // 协议乙方联系人
+        e_contract_remark: '', // 协议备注
+      },
+    }
+  },
+  computed: {
+    buySubject() {
+      return this.pageForm.buySubject
+    },
+    companyName() {
+      return this.pageForm.companyName
+    },
+    showArchiveSignModule() {
+      return this.pageForm.contract_archive_status === 1
+    },
+    requiredList() {
+      return [
+        {
+          field: 'agreeStatus',
+          message: '协议状态为必填项', // 错误提示文案
+          rank: 1,
+          required: this.required.agreeStatus,
+        },
+        {
+          field: 'signUnit',
+          message: '签约主体为必填项',
+          required: this.companyRequired,
+        }
+      ].filter(f => f.required)
+    },
+    rules() {
+      const companyRequired = this.companyRequired
+
+      return {
+        companyName: [
+          { required: companyRequired, message: '请输入公司名称', trigger: 'blur' }
+        ],
+        userTel: [
+          { required: true, message: '请输入联系人手机号', trigger: 'blur' },
+        ],
+        accountTel: [
+          { required: true, message: '请输入开通权益手机号', trigger: 'blur' },
+        ]
+      }
+    },
+    showXieYi() {
+      return this.orderDetail?.contractRes?.contract_status === 1
+    },
+    showMore() {
+      return this.showMoreXieYi
+    },
+    companyRequired() {
+      return this.showXieYi
+    },
+    showSingCode() {
+      return !this.showOnlineContractForm
+    },
+  },
+  watch: {
+    companyRequired() {
+      setTimeout(() => {
+        this.$refs.form.clearValidate()
+      }, 0)
+    },
+    buySubject() {
+      // 清空协议编号
+      this.onChangeFormItem('signCode', '')
+    },
+    // showXieYi: {
+    //   immediate: true,
+    //   handler(n) {
+    //     if (n) {
+    //       this.initSignTime()
+    //     }
+    //   }
+    // },
+  },
+  created() {
+    this.initSignTime()
+    const { pageFormValue, productArr } = this.contractFeedbackInfo || {}
+    if (pageFormValue) {
+      for (const key in pageFormValue) {
+        this.setPageForm({ key, data: pageFormValue[key] })
+      }
+    }
+    this.getOnlineContractFormShow(pageFormValue, productArr)
+  },
+  methods: {
+    // 是否显示电子协议订单
+    getOnlineContractFormShow(pageForm, pList) {
+      return calcShowOnlineContractForm(pageForm, pList)
+    },
+    setPageForm({ key, data }) {
+      this.pageForm[key] = data 
+    },
+    getState() {
+      return Object.assign({}, this.form)
+    },
+    setState(t) {
+      if (!t) return
+      Object.assign(this.form, t)
+    },
+    contractFile(val) {
+      this.onChangeFormItem('contract_file_url', val)
+    },
+    onRemoveUpload () {
+      this.onChangeFormItem('contract_file_url', '')
+    },
+    onChangeFormItem(key, e) {
+      this.pageForm[key] = e
+    },
+    initSignTime() {
+      // 初始化协议签订时间为当天
+      // this.form.signTime = Date.now()
+      this.onChangeFormItem('signTime', Date.now())
+      const { 
+        contract_status
+      } = this.orderDetail?.contractRes || {}
+      const {
+        signing_subject
+      } = this.orderDetail?.orderData || {}
+      this.pageForm.signUnit = signing_subject || 'h01'
+      this.pageForm.agreeStatus = contract_status || 1
+
+    },
+    showMoreForm() {
+      this.showMoreXieYi = !this.showMoreXieYi
+    },
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+
+</style>

+ 12 - 8
src/views/create-order/components/order-detail-submodule/OrderDetailCard.vue

@@ -15,7 +15,7 @@
             <span class="red-chong" v-if="setRedPunchDisplay('合同金额')">(红冲过)</span>
           </div>
           <div v-else-if="item.key === 'final_price_total'">
-            {{ item.label }}:{{ orderData[item.key] || '-' }}
+            {{ item.label }}:{{ orderData[item.key] || '-' }}
             <span class="red-chong" v-if="setRedPunchDisplay('合同金额')">(红冲过)</span>
           </div>
           <div v-else-if="item.key === 'commission'">
@@ -161,7 +161,7 @@ export default {
         { label: '合同金额', key: 'final_price', span: 3},
         { label: '标准售价', key: 'original_price', span: 3},
         { label: '折扣率', key: 'rate', span: 3},
-        { label: '子账号数量', key: 'subAccountCount', span: 1, condition: (product) => product.product_type === 'VIP订阅' && product.buyAccountCount && product.giftAccountCount },
+        { label: '子账号数量', key: 'subAccountCount', span: 1, condition: () => this.parsedFilter.buyAccountCount && this.parsedFilter.giftAccountCount },
         { label: '主账号数量', key: 'mainAccountCount', span: 1, condition: (product) => product.product_type === 'VIP订阅' },
         { label: '关联订单', key: 'linkedOrder', span: 1},
         { label: '开通权益手机号', key: 'phone', span: 3},
@@ -206,7 +206,8 @@ export default {
           label: '创建时间', 
           width: 102
         } 
-      ]
+      ],
+      parsedFilter: {}
     }
   },
   watch: {
@@ -244,12 +245,12 @@ export default {
               parsedFilter.give_type,
               product
             );
-            const subAccountCount = this.buildSubAccountCount(product);
+            const subAccountCount = this.buildSubAccountCount(product, parsedFilter);
             const mainAccountCount = this.buildMainAccountCount(product);
             const linkedOrder = this.processLinkedOrder(product);
             const finalPrice = this.formatNumber(product.final_price);
             const originalPrice = this.formatNumber(product.original_price);
-
+            this.parsedFilter = parsedFilter;
             return {
               ...product,
               filter: parsedFilter,
@@ -306,11 +307,14 @@ export default {
     },
 
     // 构造子账号数量字符串。
-    buildSubAccountCount(product) {
+    buildSubAccountCount(product, filter) {
+      console.log(product.product_type, 'product')
+
       if (product.product_type === 'VIP订阅' || product.product_type === '大会员') {
-        const buyCount = Number(product?.buyAccountCount) || 0;
-        const giftCount = Number(product?.giftAccountCount) || 0;
+        const buyCount = Number(filter?.buyAccountCount) || 0;
+        const giftCount = Number(filter?.giftAccountCount) || 0;
         const countTotal = buyCount + giftCount;
+        console.log(buyCount,giftCount, 'buyCount')
         return `付费${buyCount}个,赠送${giftCount}个,合计:<span class="color_main">${countTotal}</span>个`;
       }
       return '';

+ 27 - 14
src/views/create-order/components/order-detail-submodule/PaymentInfo.vue

@@ -20,7 +20,11 @@
           :table-data="paymentDetailList"
           :columns="paymentDetailColumns"
           width="1108px"
-        ></TableCard>
+        >
+          <template v-slot:return_voucher_url="{ row }">
+            <span @click="vouched(row.row.return_voucher_url)" class="column-cell">点击查看</span>
+          </template>
+        </TableCard>
       </div>
     </InfoCard>
     <InfoCard title="用户自助下单对公转账">
@@ -73,20 +77,20 @@ export default {
         {
           label: '回款时间',
           prop: 'return_time',
-          width: '150',
+          width: '112',
           render (row) {
             return defaultRender(row.return_time)
           }
         },
-        // {
-        //   label: '回款金额',
-        //   prop: 'paymoney',
-        //   width: '112'
-        // },
+        {
+          label: '支付凭证',
+          prop: 'return_voucher_url',
+          width: '90'
+        },
         {
           label: '支付方式',
           prop: 'return_type',
-          width: '112',
+          width: '90',
           render (row) {
             const payCashStatus = [
               { v: '1', n: '微信支付' },
@@ -104,7 +108,7 @@ export default {
         {
           label: '回款银行',
           prop: 'bank_name',
-          width: '210',
+          width: '120',
           render (row) {
             return defaultRender(row.bank_name)
           }
@@ -112,7 +116,7 @@ export default {
         {
           label: '支付单号/银行流水号',
           prop: 'return_code',
-          width: '210',
+          width: '112',
           render (row) {
             return row.bank_flow || row.return_code
           }
@@ -128,7 +132,7 @@ export default {
         {
           label: '流水金额',
           prop: 'flow_money',
-          width: '112',
+          width: '90',
           render: (row) => {
             return row.flow_money ? '¥' + this.returnAmount(row.flow_money) : this.returnAmount(0)
           }
@@ -136,7 +140,7 @@ export default {
         {
           label: '操作时间',
           prop: 'operate_time',
-          width: '134',
+          width: '112',
           render: (row) => {
             return defaultRender(row.operate_time) 
           }
@@ -148,12 +152,20 @@ export default {
           render: (row) => {
             return defaultRender(row.operate_person) 
           }
+        },
+        {
+          label: '回款说明',
+          prop: 'return_remark',
+          width: '202',
+          render (row) {
+            return defaultRender(row.return_remark)
+          }
         }
       ],
       paymentDetailList_: [
         {
           return_time: '2023-12-31 13:21:32',
-          // paymoney: '¥2,000.00',
+          paymoney: '点击查看',
           return_type: '微信支付',
           // commission: '¥100.00',
           bank_name: '广发银行北京顺义支行',
@@ -161,7 +173,8 @@ export default {
           pay_account_name: '张三',
           flow_money: '¥2,000.00',
           operate_time: '2023-12-31 13:21:32',
-          operate_person: '张三'
+          operate_person: '张三',
+          return_remark: '备注'
         }
       ],
       transerColumns: [

+ 44 - 0
src/views/create-order/hooks/utils.js

@@ -1,6 +1,7 @@
 import store from '@/store'
 import { SalePersonTableRow } from '@/views/create-order/data/interface'
 import { div } from '@/utils/number'
+import { productKeyMap } from '@/views/create-order/data'
 
 // 从部门树中,根据名字获取人员信息
 // cb是个函数,满足cb()为true则返回
@@ -83,3 +84,46 @@ export function calcSaleTableList(saleFinalList) {
 
   return pageFormValue
 }
+
+// 通用:计算是否展示电子协议
+export function calcShowOnlineContractForm(pageForm, userProductInfoList) {
+  const paybackCompanyCheck = pageForm.signUnit == 'h01' // 签约主体为:北京剑鱼信息技术有限公司/h01
+  const contractStatusCheck = pageForm.agreeStatus === 1 // 协议状态为签协议
+  // 4.支持线上生成电子协议:
+  // (1)签约主体为“北京剑鱼信息技术有限公司”;
+  // (2)仅有1个产品销售策略为“售卖”;
+  const productLength = userProductInfoList.length
+  let productCheck = false
+  if (productLength === 1) {
+    const productForm = userProductInfoList[0]
+    const productSpec = productForm?.productSpecification
+    const productCode = productForm?.productCode
+    const passMap = {
+      svip: false,
+      bigmember: false
+    }
+
+    const payment = productForm?.paymentType
+    // 售卖
+    const giftPass = productForm.saleGifts === 1
+
+    // 1. 超级订阅:(且付费类型为“购买”、“续费”)
+    const vipSalePass = [1, 2].includes(payment)
+    const vipSpecPass = productCode === productKeyMap.cjdy
+    passMap.svip = giftPass && vipSalePass && vipSpecPass
+
+    // 2. 大会员:售卖 && 购买/续费/试用
+    const bigSalePass = [1, 2, 4].includes(payment)
+    // 6:dyh002:商机版2.0、7:dyh003:专家版2.30190:dyh004:商机版2.0(单省版)
+    // 以上几种才可以创建电子协议
+    const bigPassProductTypeArr = ['dyh002', 'dyh003', 'dyh004']
+    const bigmemberSpecPass = bigPassProductTypeArr.includes(productSpec)
+    passMap.bigmember = giftPass && bigSalePass && bigmemberSpecPass
+
+    // 满足任一产品条件即可:找个一个true就返回true
+    productCheck = Object.values(passMap).includes(true)
+  }
+  // (3)且销售策略为“售卖”的产品规格及购买主体有配置电子协议模板;
+  // 销售策略为“售卖”的产品规格付费类型为“购买”、“续费”、“试用”。
+  return paybackCompanyCheck && contractStatusCheck && productCheck 
+}