Browse Source

Merge branch 'feature/v2.4.24' into dev/v2.4.24_tsz

Signed-off-by: tangshizhe <48740614+tangshizhe@users.noreply.github.com>
tangshizhe 1 year ago
parent
commit
d7b481f260

+ 220 - 0
src/components/OnlineContractForm.vue

@@ -0,0 +1,220 @@
+<template>
+    <!-- 线上协议表单,此表单必须在iview的Form组件下使用,否则会造成FormItem不显示 -->
+    <fieldset class="online-contract-form">
+        <legend class="online-contract-form-legend">电子协议表单</legend>
+        <FormItem label="电子协议类型" :label-width="140" required>
+            <RadioGroup :value="e_contract_type" @on-change="contractTypeChange">
+                <Radio :label="1" style="marginRight:30px">有电子章</Radio>
+                <Radio :label="2">无电子章</Radio>
+            </RadioGroup>
+        </FormItem>
+        <FormItem label="协议甲方类型" :label-width="140" required v-if="buySubject == '1'">
+            <RadioGroup :value="e_contract_userA_type" @on-change="contractUserATypeChange">
+                <Radio :label="1" style="marginRight:30px">个人</Radio>
+                <Radio :label="2">企业</Radio>
+            </RadioGroup>
+        </FormItem>
+        <FormItem label="协议甲方" :label-width="140" required v-if="contractUserANameShow">
+            <Input :value="e_contract_userA_name" @on-change="inputChange($event, 'e_contract_userA_name')" placeholder="请输入甲方名称"></Input>
+        </FormItem>
+        <Form-item label="协议甲方联系人" :label-width="140" required>
+            <Input :value="e_contract_userA_contacts_name" @on-change="inputChange($event, 'e_contract_userA_contacts_name')" placeholder="请输入甲方联系人"></Input>
+        </Form-item>
+        <Form-item label="协议甲方联系方式" :label-width="140" required>
+            <Input :value="e_contract_userA_contacts_tel" @on-change="inputChange($event, 'e_contract_userA_contacts_tel')" placeholder="请输入甲方联系方式"></Input>
+        </Form-item>
+        <Form-item label="协议甲方联系地址" :label-width="140" required>
+            <Input
+                :value="e_contract_userA_contacts_address"
+                maxlength="45"
+                placeholder="请输入甲方联系地址"
+                type="textarea"
+                @on-change="inputChange($event, 'e_contract_userA_contacts_address')"
+                :autosize="{minRows: 2,maxRows: 5}"></Input>
+        </Form-item>
+        <Form-item label="协议乙方联系人" :label-width="140" required>
+            <Input :value="e_contract_userB_contacts_name" @on-change="inputChange($event, 'e_contract_userB_contacts_name')" placeholder="请输入乙方联系人"></Input>
+        </Form-item>
+        <Form-item label="协议备注" :label-width="140">
+            <Input
+                :value="e_contract_remark"
+                placeholder="请输入协议备注"
+                maxlength="60"
+                type="textarea"
+                @on-change="inputChange($event, 'e_contract_remark')"
+                :autosize="{minRows: 2,maxRows: 5}"></Input>
+        </Form-item>
+    </fieldset>
+</template>
+<script>
+    export default {
+        name: 'OnlineContractForm',
+        props: {
+            // 购买主体
+            buySubject: {
+                type: String,
+                default: function () {
+                    return '1' // '1'个人  '2'企业
+                }
+            },
+            // 订单公司名称
+            orderEntName: {
+                type: String,
+                default: ''
+            },
+            // 订单手机号
+            orderPhone: {
+                type: String,
+                default: function () {
+                    return ''
+                }
+            },
+            e_contract_type: {
+                type: Number,
+                default: 1
+            },
+            e_contract_userA_type: {
+                type: Number,
+                default: 1
+            },
+            e_contract_userA_name: {
+                type: String,
+                default: ''
+            },
+            e_contract_userA_contacts_name: {
+                type: String,
+                default: ''
+            },
+            e_contract_userA_contacts_tel: {
+                type: String,
+                default: ''
+            },
+            e_contract_userA_contacts_address: {
+                type: String,
+                default: ''
+            },
+            e_contract_userB_contacts_name: {
+                type: String,
+                default: ''
+            },
+            e_contract_remark: {
+                type: String,
+                default: ''
+            },
+        },
+        data () {
+            return {
+                e_: {
+                    contract_type: 1, // 电子协议类型:  1有电子章  2无电子章
+                    contract_userA_type: 1, // 协议甲方类型: 1个人  2企业
+                    contract_userA_name: '', // 协议甲方
+                    contract_userA_contacts_name: '', // 协议甲方联系人
+                    contract_userA_contacts_tel: '', // 协议甲方联系方式
+                    contract_userA_contacts_address: '', // 协议甲方联系地址
+                    contract_userB_contacts_name: '', // 协议乙方联系人
+                    contract_remark: '', // 协议备注
+                }
+            }
+        },
+        computed: {
+            contractUserANameShow () {
+                // 如购买主体和甲方类型都为“个人”:则展示此字段。否则不展示,并且默认甲方名称为订单公司名称(此时订单公司名称必填)
+                if (this.buySubject == '1' && this.e_contract_userA_type == 1) {
+                    return true
+                } else {
+                    return false
+                }
+            }
+        },
+        watch: {
+            buySubject: {
+                immediate: false,
+                handler (n) {
+                    this.contractUserATypeChange(n - 0)
+                    if (n === '2') {
+                        // 订单购买主体变为企业时候,需要同步企业名
+                        this.syncEntName(this.orderEntName)
+                    }
+                }
+            },
+            orderEntName: {
+                handler (n) {
+                    if (!this.contractUserANameShow) {
+                        if (n) {
+                            this.inputChangeVal(n, 'e_contract_userA_name')
+                        }
+                    }
+                }
+            },
+            // contractUserANameShow为false时候,默认甲方名称为订单公司名称
+            contractUserANameShow: {
+                immediate: true,
+                handler (n) {
+                    if (!n) {
+                        this.syncEntName(this.orderEntName)
+                    }
+                }
+            },
+        },
+        created () {
+            this.initData()
+        },
+        methods: {
+            initData () {
+                // 初始化默认值
+                if (this.orderPhone) {
+                    this.inputChangeVal(this.orderPhone, 'e_contract_userA_contacts_tel')
+                }
+                if (this.orderEntName) {
+                    this.inputChangeVal(this.orderEntName, 'e_contract_userA_name')
+                }
+                // 默认填写订单人的名字
+                if (!this.e_contract_userB_contacts_name) {
+                    const defaultName = this.$store.getters.getAdminUser.username
+                    this.inputChangeVal(defaultName, 'e_contract_userB_contacts_name')
+                }
+                if (this.buySubject == '2') {
+                    // 如购买主体为“企业”. 协议甲方类型不展示,并同步默认值为“企业”;
+                    this.contractUserATypeChange(this.buySubject - 0)
+                    this.syncEntName(this.orderEntName)
+                }
+            },
+            syncEntName (entName) {
+                if (entName) {
+                    this.inputChangeVal(entName, 'e_contract_userA_name')
+                }
+            },
+            contractTypeChange (val) {
+                this.$emit('update:e_contract_type', val)
+            },
+            contractUserATypeChange (val) {
+                this.$emit('update:e_contract_userA_type', val)
+            },
+            inputChange (e, key) {
+                this.$emit(`update:${key}`, e.target.value)
+            },
+            inputChangeVal (value, key) {
+                this.$emit(`update:${key}`, value)
+            },
+        }
+    }
+</script>
+<style lang="scss" scoped>
+.online-contract-form {
+    margin-bottom: 20px;
+    padding: 20px 10px;
+    ::v-deep {
+        .ivu-form-item:last-of-type {
+            margin-bottom: 0;
+        }
+        .ivu-form-item-label {
+            text-align: right;
+            padding-right: 10px;
+        }
+    }
+
+    .online-contract-form-legend {
+        padding: 0 8px;
+    }
+}
+</style>

+ 133 - 21
src/views/order/components/bigOrder.vue

@@ -40,6 +40,9 @@
                     </Spin>
                     <p v-html="colr" style="color:#e13d13"></p>
                 </FormItem>
+                <FormItem label="公司名称" :required="member.buySubject == '2'">
+                    <Input v-model.trim="member.companyName" type="text" :maxlength="40" placeholder="请输入公司名称"></Input>
+                </FormItem>
                 <FormItem label="产品类型">
                     <Select v-model="member.products" placeholder="请选择产品类型(暂不支持数据导出)" @on-change="proChange" :disabled="proDis">
                         <!-- <Option v-for="item in bigPro" :value="item.v" :key="item.v">{{ item.n }}</Option> -->
@@ -167,6 +170,11 @@
                     <FormItem label="总计" :label-width="194" v-else>
                         <span class="sum-jin">{{tipFunc(member.sums)}}</span>
                     </FormItem>
+                    <FormItem label="计费模式" required>
+                        <Select v-model="member.billingMode" placeholder="请选择计费模式" @on-change="moneyChange">
+                            <Option v-for="item in chargeStatus" :value="item.v" :key="item.v">{{ item.n }}</Option>
+                        </Select>
+                    </FormItem>
                     <FormItem label="应付金额" required v-if="creAuth !== '1'">
                         <Input
                             v-model="member.payMoney"
@@ -225,23 +233,38 @@
                             placeholder="请输入手续费"
                         ></Input>
                     </FormItem>
-                    <FormItem label="协议状态" required>
-                        <Select v-model="member.agreementStatus" placeholder="请选择协议状态">
-                            <Option v-for="item in agreeStatus" :value="item.v" :key="item.v">{{ item.n }}</Option>
+                    <FormItem label="约定支付方式" required>
+                        <Select v-model="member.payType" placeholder="请选择约定支付方式">
+                            <Option v-for="item in payTypes" :value="item.v" :key="item.v">{{ item.n }}</Option>
                         </Select>
                     </FormItem>
                     <FormItem label="签约主体" required>
                         <v-cascader ref="casRef2" :initVal="'h01'" placeholderType="签约主体" reqType="签约主体" @levelChange="paybackChange" v-if="bShow"></v-cascader>
                     </FormItem>
-                    <FormItem label="约定支付方式" required>
-                        <Select v-model="member.payType" placeholder="请选择约定支付方式">
-                            <Option v-for="item in payTypes" :value="item.v" :key="item.v">{{ item.n }}</Option>
+                    <FormItem label="协议状态" required>
+                        <Select v-model="member.agreementStatus" placeholder="请选择协议状态">
+                            <Option v-for="item in agreeStatus" :value="item.v" :key="item.v">{{ item.n }}</Option>
                         </Select>
                     </FormItem>
+                    <OnlineContractForm
+                        ref="onlineContractFormRef"
+                        v-if="showOnlineContractForm"
+                        :buySubject="member.buySubject"
+                        :orderEntName="member.companyName"
+                        :orderPhone="member.phone"
+                        :e_contract_type.sync="member.e_contract_type"
+                        :e_contract_userA_type.sync="member.e_contract_userA_type"
+                        :e_contract_userA_name.sync="member.e_contract_userA_name"
+                        :e_contract_userA_contacts_name.sync="member.e_contract_userA_contacts_name"
+                        :e_contract_userA_contacts_tel.sync="member.e_contract_userA_contacts_tel"
+                        :e_contract_userA_contacts_address.sync="member.e_contract_userA_contacts_address"
+                        :e_contract_userB_contacts_name.sync="member.e_contract_userB_contacts_name"
+                        :e_contract_remark.sync="member.e_contract_remark"
+                    />
                     <FormItem label="协议签订时间" v-show="member.agreementStatus == '1'">
                         <date-sigle ref="sigleRef" :dateType="'date'" :placeholderd="'请选择协议签订时间'" @startDate="agreeDate" :overTime="0"></date-sigle>
                     </FormItem>
-                    <FormItem label="协议编号" v-show="member.agreementStatus == '1'">
+                    <FormItem label="协议编号" v-show="member.agreementStatus == '1' && !showOnlineContractForm">
                         <Input v-model="member.agreementNumber" type="text" placeholder="请输入协议编号"></Input>
                     </FormItem>
                     <FormItem label="协议归档状态" v-show="member.agreementStatus == '1'">
@@ -256,20 +279,17 @@
                     <FormItem label="归档份数" v-show="member.agreementStatus == '1'&&member.contract_archive_status == '1'">
                         <Input v-model="member.contract_archive_num" type="tel" maxlength="4" @on-keyup="payHandler" placeholder="请输入归档份数"></Input>
                     </FormItem>
-                    <FormItem label="合同" class="chuan-pay">
+                    <FormItem label="归档协议" class="chuan-pay">
                         <b-upload
                             ref="uploadRef"
                             @fileData="contractFile"
-                            :placeholdered="'请上传合同'"
+                            :placeholdered="'请上传归档协议'"
                             :accepted="'.doc,.pdf,.docx,.rar,.zip,.jpg,.png,.jpeg'"
                             :formated="['doc','pdf','docx','rar','zip','jpg','png','jpeg']"
                             :multipled="false"
                             @onRemove="onRemoveUpload"
                         ></b-upload>
                     </FormItem>
-                    <FormItem label="公司名称" :required="member.buySubject == '2'">
-                        <Input v-model.trim="member.companyName" type="text" :maxlength="40" placeholder="请输入公司名称"></Input>
-                    </FormItem>
                     <FormItem label="销售人员">
                         <sale-select ref="saleRef" @salePerson="salePerson" :setDefaultPerson="this.$store.getters.getAdminUser.username"></sale-select>
                     </FormItem>
@@ -290,8 +310,8 @@
                     <FormItem label="业绩统计时间">
                         <date-sigle ref="sigleRef3" :dateType="'date'" :dataV="member.sale_time" :placeholderd="'请选择业绩统计时间'" @startDate="saleDate" :overTime="0"></date-sigle>
                     </FormItem>
-                    <FormItem label="备注">
-                        <Input v-model="member.remark" type="text" :maxlength="40" placeholder="请输入备注"></Input>
+                    <FormItem label="订单备注">
+                        <Input v-model="member.remark" type="text" :maxlength="40" placeholder="请输入订单备注"></Input>
                     </FormItem>
                 </div>
             </Form>
@@ -309,10 +329,13 @@ import { dateFormatter } from '@/assets/js/date'
 import dateSigle from '@/components/dateSigle'
 import vCascader from '@/components/cascader'
 import bUpload from '@/components/uploadFile.vue'
+import OnlineContractForm from '@/components/OnlineContractForm'
 import saleSelect from './salesSelect.vue'
 import { getDateSub } from '@/assets/js/date'
 export default {
+    name: 'CreateBigOrderModal',
     components: {
+        OnlineContractForm,
         vCascader,
         dateSigle,
         bUpload,
@@ -323,7 +346,7 @@ export default {
             type: Boolean,
             default: false
         }
-  },
+    },
     computed: {
         proDis:function() {
             if (this.member.phone == '') {
@@ -339,10 +362,32 @@ export default {
                     }
                 }
             }
-        }
+        },
+        showOnlineContractForm () {
+            const paybackCompanyCheck = this.member.paybackCompany == 'h01' // 签约主体为:北京剑鱼信息技术有限公司/h01
+            const contractStatusCheck = this.member.agreementStatus == '1' // 协议状态为签协议
+            // 展示条件:
+            // 1. 产品类型是超级订阅(且付费类型为“购买”、“续费”)才展示。
+            // 2. 产品类型是“大会员”且会员套餐为“商机版2.0”、“专家版2.0”(且服务类型为“新购服务”、“延长服务”)
+            // memberLevelMap.id:6'商机版2.0'、7'专家版2.0'
+            const memberLevel = this.member.level
+            if (!memberLevel) return false
+            const memberLevelMap = JSON.parse(memberLevel)
+            // console.log(memberLevelMap)
+            // createType '1'新建  '2'补充  '3'延期
+            const createType = this.nums == 0?this.member.createType:'1'
+            const bigmemberCheck = (memberLevelMap.id == 6 || memberLevelMap.id == 7) && (createType == '1' || createType == '3')
+            const productTypeCheck = bigmemberCheck
+            return paybackCompanyCheck && contractStatusCheck && productTypeCheck
+        },
     },
     methods: {
-        initialized() {// 初始化
+        initialized(conf = {}) {// 初始化
+          // 排除某些字段不重置
+          if (!conf) {
+            conf = {}
+          }
+          const excludeList = conf.excludeList || []
           this.member.bigMoney = 0
           this.member.subMoney = 0
           this.member.supplyMoney = 0
@@ -356,7 +401,9 @@ export default {
           this.member.supplyPayMoney = ''
           this.member.payCycle = ''
           this.member.contractUrl = ''
-          this.member.companyName = ''
+          if (!excludeList.includes('companyName')) {
+            this.member.companyName = ''
+          }
           this.member.remark = ''
           this.member.agreementStatus = ''
           this.member.payType = ''
@@ -389,6 +436,14 @@ export default {
           this.optionDis5 = false
           this.optionDis6 = false
           this.combo_id = ''
+
+          Object.keys(this.member).forEach(key => {
+            if (key.startsWith('e_contract_')) {
+              // 默认重置
+              this.member[key] = this.$options.data().member[key]
+            }
+          })
+
           setTimeout(() => {
             let sigs = this.$refs.sigleRef
             let sigs1 = this.$refs.sigleRef3
@@ -1090,7 +1145,10 @@ export default {
             })
         },
         leChange(val) {// 会员套餐
-            this.initialized()
+            if (!val) return
+            this.initialized({
+              excludeList: ['companyName'] 
+            })
             val = JSON.parse(val)
             this.datas2 = []
             this.sArr = []
@@ -1773,6 +1831,42 @@ export default {
               this.$Notice.warning({title: '请选择计费模式'})
               return
             }
+            if (this.showOnlineContractForm) {
+                // 如购买主体或甲方类型为“企业”,则公司名称必填
+                const entMark = this.member.buySubject == '2' || this.member.e_contract_userA_type == 2
+                if (entMark && !this.member.companyName) {
+                    this.$Notice.warning({title: '公司名称必填'})
+                    return
+                }
+                if (!this.member.e_contract_type) {
+                    this.$Notice.warning({title: '电子协议类型必填'})
+                    return
+                }
+                if (!this.member.e_contract_userA_type) {
+                    this.$Notice.warning({title: '协议甲方类型必填'})
+                    return
+                }
+                if (!this.member.e_contract_userA_name) {
+                    this.$Notice.warning({title: '协议甲方必填'})
+                    return
+                }
+                if (!this.member.e_contract_userA_contacts_name) {
+                    this.$Notice.warning({title: '协议甲方联系人必填'})
+                    return
+                }
+                if (!this.member.e_contract_userA_contacts_tel) {
+                    this.$Notice.warning({title: '协议甲方联系方式必填'})
+                    return
+                }
+                if (!this.member.e_contract_userA_contacts_address) {
+                    this.$Notice.warning({title: '协议甲方联系地址必填'})
+                    return
+                }
+                if (!this.member.e_contract_userB_contacts_name) {
+                    this.$Notice.warning({title: '协议乙方联系人必填'})
+                    return
+                }
+            }
             if (this.member.buySubject == '2') {
                 if(this.member.buyCount == '')  {
                     this.$Notice.warning({title: '请输入购买数量'})
@@ -1884,6 +1978,15 @@ export default {
                     saleDep: this.saleCode,
                     payType: this.member.payType,
                     saleMoney: JSON.stringify({data: this.saleTableData}),
+                    // 电子协议相关
+                    e_contract_type: this.member.e_contract_type, // 电子协议类型
+                    e_contract_userA_type: this.member.e_contract_userA_type, // 协议甲方类型
+                    e_contract_userA_name: this.member.e_contract_userA_name, // 协议甲方
+                    e_contract_userA_contacts_name: this.member.e_contract_userA_contacts_name, // 协议甲方联系人
+                    e_contract_userA_contacts_tel: this.member.e_contract_userA_contacts_tel, // 协议甲方联系方式
+                    e_contract_userA_contacts_address: this.member.e_contract_userA_contacts_address, // 协议甲方联系地址
+                    e_contract_userB_contacts_name: this.member.e_contract_userB_contacts_name, // 协议乙方联系人
+                    e_contract_remark: this.member.e_contract_remark, // 协议备注
                 }
                 if (this.showOrderStatus){
                     this.urlReq('/order/createBigOrder', obj)
@@ -2141,7 +2244,16 @@ export default {
                 single:false, // 大会员商机版2.0-单省版 radio 选中状态
                 areaCount:'0', // 大会员省份版-省份数量
                 payType: '',
-                saleCodeModel: []
+                saleCodeModel: [],
+                // 电子协议相关
+                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: '', // 协议备注
             },
             isAll: false,
             radioDis1: false,
@@ -2154,7 +2266,7 @@ export default {
             rowArr: {},
             agreeStatus: [
                 {v: '0', n: '不签协议'},
-                {v: '1', n: '签协议'}
+                {v: '1', n: '签协议'}
             ],
             payTypes: [
                 {v: 'transferAccounts', n: '对公转账'},

+ 186 - 71
src/views/order/components/bigOrderEdit.vue

@@ -49,6 +49,9 @@
             </Spin>
             <p v-html="colr" style="color:#e13d13"></p>
           </FormItem>
+          <FormItem label="公司名称" prop="" :required="member.buySubject == '2'">
+            <Input v-model.trim="member.companyName" type="text" :maxlength="40" :disabled="finish_dis" placeholder="请输入公司名称"></Input>
+          </FormItem>
           <FormItem label="产品类型">
             <!-- <Select v-model="member.products" placeholder="请选择产品类型(暂不支持数据导出)" @on-change="proChange" :disabled="proDis || interested"></Select> -->
             <!-- 我的订单不支持编辑产品类型 -->
@@ -60,11 +63,6 @@
               <Option  value="3" :disabled="member.buySubject=='2'">大会员补充包</Option>
             </Select>
           </FormItem>
-          <FormItem label="计费模式" prop="billingMode">
-            <Select v-model="member.billingMode" placeholder="请选择计费模式" @on-change="moneyChange">
-              <Option v-for="item in chargeStatus" :value="item.v" :key="item.v">{{ item.n }}</Option>
-            </Select>
-          </FormItem>
           <FormItem label="购买数量" required v-if="member.buySubject == '2'">
                     <Input v-model="member.buyCount" type="tel" maxlength="4" @on-keyup="buyHandler" placeholder="请填写购买数量" :disabled="finish_dis"></Input>
                 </FormItem>
@@ -196,6 +194,11 @@
             <FormItem label="总计" :label-width="194" v-else>
               <span class="sum-jin">{{ tipFunc(member.sums) }}</span>
             </FormItem>
+            <FormItem label="计费模式" prop="billingMode">
+              <Select v-model="member.billingMode" placeholder="请选择计费模式" @on-change="moneyChange">
+                <Option v-for="item in chargeStatus" :value="item.v" :key="item.v">{{ item.n }}</Option>
+              </Select>
+            </FormItem>
             <FormItem label="应付金额" prop="payMoney" v-if="creAuth !== '1'">
               <Input
                   v-model="member.payMoney"
@@ -256,25 +259,40 @@
                   :disabled="finish_dis"
               ></Input>
             </FormItem>
-            <FormItem label="协议状态" prop="agreementStatus">
-              <Select v-model="member.agreementStatus" placeholder="请选择协议状态">
-                <Option v-for="item in agreeStatus" :value="item.v" :key="item.v">{{ item.n }}</Option>
+            <FormItem label="约定支付方式" required>
+              <Select v-model="member.payType" placeholder="请选择约定支付方式" :disabled="finish_dis">
+                <Option v-for="item in payTypes" :value="item.v" :key="item.v">{{ item.n }}</Option>
               </Select>
             </FormItem>
-            <FormItem label="签约主体" prop="paybackCompany">
+            <FormItem label="签约主体">
               <v-cascader ref="casRef2" :initVal="'h01'" placeholderType="签约主体" reqType="签约主体"
                           @levelChange="paybackChange" :disabled="finish_dis" v-if="bShow"></v-cascader>
             </FormItem>
-            <FormItem label="约定支付方式" required>
-              <Select v-model="member.payType" placeholder="请选择约定支付方式" :disabled="finish_dis">
-                <Option v-for="item in payTypes" :value="item.v" :key="item.v">{{ item.n }}</Option>
+            <FormItem label="协议状态" prop="agreementStatus">
+              <Select v-model="member.agreementStatus" placeholder="请选择协议状态">
+                <Option v-for="item in agreeStatus" :value="item.v" :key="item.v">{{ item.n }}</Option>
               </Select>
             </FormItem>
+            <OnlineContractForm
+              ref="onlineContractFormRef"
+              v-if="showOnlineContractForm"
+              :buySubject="member.buySubject"
+              :orderEntName="member.companyName"
+              :orderPhone="member.phone"
+              :e_contract_type.sync="member.e_contract_type"
+              :e_contract_userA_type.sync="member.e_contract_userA_type"
+              :e_contract_userA_name.sync="member.e_contract_userA_name"
+              :e_contract_userA_contacts_name.sync="member.e_contract_userA_contacts_name"
+              :e_contract_userA_contacts_tel.sync="member.e_contract_userA_contacts_tel"
+              :e_contract_userA_contacts_address.sync="member.e_contract_userA_contacts_address"
+              :e_contract_userB_contacts_name.sync="member.e_contract_userB_contacts_name"
+              :e_contract_remark.sync="member.e_contract_remark"
+            />
             <FormItem label="协议签订时间" v-show="member.agreementStatus == '1'">
               <date-sigle ref="sigleRef" :dateType="'date'" :placeholderd="'请选择协议签订时间'" @startDate="agreeDate"
                           :overTime="0"></date-sigle>
             </FormItem>
-            <FormItem label="协议编号" v-show="member.agreementStatus == '1'">
+            <FormItem label="协议编号" v-show="member.agreementStatus == '1' && !showOnlineContractForm">
               <Input v-model="member.agreementNumber" type="text" placeholder="请输入协议编号"></Input>
             </FormItem>
             <FormItem label="协议归档状态" v-show="member.agreementStatus == '1'">
@@ -291,20 +309,17 @@
               <Input v-model="member.contract_archive_num" type="tel" maxlength="4" @on-keyup="payHandler"
                      placeholder="请输入归档份数"></Input>
             </FormItem>
-            <FormItem label="合同" class="chuan-pay">
+            <FormItem label="归档协议" class="chuan-pay">
               <b-upload
                   ref="uploadRef"
                   @fileData="contractFile"
-                  :placeholdered="'请上传合同'"
+                  :placeholdered="'请上传归档协议'"
                   :accepted="'.doc,.pdf,.docx,.rar,.zip,.jpg,.png,.jpeg'"
                   :formated="['doc','pdf','docx','rar','zip','jpg','png','jpeg']"
                   :multipled="false"
                   @onRemove="onRemoveUpload"
               ></b-upload>
             </FormItem>
-            <FormItem label="公司名称" prop="" :required="member.buySubject == '2'">
-              <Input v-model.trim="member.companyName" type="text" :maxlength="40" :disabled="finish_dis" placeholder="请输入公司名称"></Input>
-            </FormItem>
             <FormItem label="销售人员">
               <sale-select ref="saleRef" :saleType="'1'" @salePerson="salePerson" v-if="bShow"></sale-select>
             </FormItem>
@@ -326,8 +341,8 @@
               <date-sigle ref="sigleRef3" :dateType="'date'" :dataV="member.sale_time" :placeholderd="'请选择业绩统计时间'"
                           @startDate="saleDate" :overTime="0"></date-sigle>
             </FormItem>
-            <FormItem label="备注">
-              <Input v-model="member.remark" type="text" :maxlength="40" placeholder="请输入备注"></Input>
+            <FormItem label="订单备注">
+              <Input v-model="member.remark" type="text" :maxlength="40" placeholder="请输入订单备注"></Input>
             </FormItem>
           </div>
         </Form>
@@ -368,13 +383,16 @@
 import {dateFormatter, getDateSub} from '@/assets/js/date'
 import dateSigle from '@/components/dateSigle'
 import vCascader from '@/components/cascader'
+import OnlineContractForm from '@/components/OnlineContractForm'
 import bUpload from '@/components/uploadFile.vue'
 import saleSelect from './salesSelect.vue'
 import reviewRecord from './reviewRecord.vue'
 
 
 export default {
+  name: 'EditBigOrderModal',
   components: {
+    OnlineContractForm,
     vCascader,
     dateSigle,
     bUpload,
@@ -417,7 +435,24 @@ export default {
       } else {
         return true
       }
-    }
+    },
+    showOnlineContractForm () {
+      const paybackCompanyCheck = this.member.paybackCompany == 'h01' // 签约主体为:北京剑鱼信息技术有限公司/h01
+      const contractStatusCheck = this.member.agreementStatus == '1' // 协议状态为签协议
+      // 展示条件:
+      // 1. 产品类型是超级订阅(且付费类型为“购买”、“续费”)才展示。
+      // 2. 产品类型是“大会员”且会员套餐为“商机版2.0”、“专家版2.0”(且服务类型为“新购服务”、“延长服务”)
+      // memberLevelMap.id:6'商机版2.0'、7'专家版2.0'
+      const memberLevel = this.member.level
+      if (!memberLevel) return false
+      const memberLevelMap = JSON.parse(memberLevel)
+      // console.log(memberLevelMap)
+      // createType '1'新建  '2'补充  '3'延期
+      const createType = this.nums == 0?this.member.createType:'1'
+      const bigmemberCheck = (memberLevelMap.id == 6 || memberLevelMap.id == 7) && (createType == '1' || createType == '3')
+      const productTypeCheck = bigmemberCheck
+      return paybackCompanyCheck && contractStatusCheck && productTypeCheck
+    },
   },
   watch: {
     bigMemberModuleShow (n) {
@@ -441,7 +476,7 @@ export default {
             this.$refs.sigleRef3.dataVals = new Date(res.sale_time)
           },1000)
           setTimeout( ()=>{
-            if (res.salesperson) {
+            if (res.salesperson && res.saleMoney) {
               this.saleTableData = JSON.parse(res.saleMoney).data
             }
           },2000)
@@ -473,8 +508,20 @@ export default {
   },
   created () {
     this.getSalesChannelItem()
+    this.getComboList()
   },
   methods: {
+    getComboList () {
+      const levelDown = []
+      this.$request('/order/getCombo').data().success((res) => {
+        res.data.lists.forEach(v => {
+          if (v.id !== 4) {// 试用版
+            levelDown.push(v)
+          }
+        })
+        this.levelDown = levelDown
+      }).get()
+    },
     getSalesChannelItem () {
       this.$request('/order/getSalesChannelItem').data({
           name: this.reqType
@@ -670,6 +717,14 @@ export default {
       this.optionDis4 = false
       this.optionDis5 = false
       this.optionDis6 = false
+
+      Object.keys(this.member).forEach(key => {
+        if (key.startsWith('e_contract_')) {
+          // 默认重置
+          this.member[key] = this.$options.data().member[key]
+        }
+      })
+
       setTimeout(() => {
         // this.$refs.saleRef.salePerson = ''
         let sigs = this.$refs.sigleRef
@@ -1004,9 +1059,9 @@ export default {
           }else{
             this.colr = ''
             this.downDis = false
-
           }
-          
+          // 触发一次change事件
+          this.leChange(this.member.level)
         }).get()
       }
       if (val == 2 || val == 3) {
@@ -1324,6 +1379,8 @@ export default {
       })
     },
     leChange(val, check = true) {// 会员套餐
+      // console.log("会员套餐", val, check)
+      if (!val) return
       val = val ? JSON.parse(val) : ''
       this.sArr = []
       this.combo_id = val
@@ -2004,6 +2061,42 @@ export default {
         this.$Notice.warning({title: '请选择计费模式'})
         return
       }
+      if (this.showOnlineContractForm) {
+        // 如购买主体或甲方类型为“企业”,则公司名称必填
+        const entMark = this.member.buySubject == '2' || this.member.e_contract_userA_type == 2
+        if (entMark && !this.member.companyName) {
+          this.$Notice.warning({title: '公司名称必填'})
+          return
+        }
+        if (!this.member.e_contract_type) {
+          this.$Notice.warning({title: '电子协议类型必填'})
+          return
+        }
+        if (!this.member.e_contract_userA_type) {
+          this.$Notice.warning({title: '协议甲方类型必填'})
+          return
+        }
+        if (!this.member.e_contract_userA_name) {
+          this.$Notice.warning({title: '协议甲方必填'})
+          return
+        }
+        if (!this.member.e_contract_userA_contacts_name) {
+          this.$Notice.warning({title: '协议甲方联系人必填'})
+          return
+        }
+        if (!this.member.e_contract_userA_contacts_tel) {
+          this.$Notice.warning({title: '协议甲方联系方式必填'})
+          return
+        }
+        if (!this.member.e_contract_userA_contacts_address) {
+          this.$Notice.warning({title: '协议甲方联系地址必填'})
+          return
+        }
+        if (!this.member.e_contract_userB_contacts_name) {
+          this.$Notice.warning({title: '协议乙方联系人必填'})
+          return
+        }
+      }
       if (this.member.buySubject == '2') {
         if(this.member.buyCount == '')  {
             this.$Notice.warning({title: '请输入购买数量'})
@@ -2133,6 +2226,15 @@ export default {
           payType: this.member.payType,
           saleDep: this.saleCode,
           saleMoney: JSON.stringify({data: this.saleTableData}),
+          // 电子协议相关
+          e_contract_type: this.member.e_contract_type, // 电子协议类型
+          e_contract_userA_type: this.member.e_contract_userA_type, // 协议甲方类型
+          e_contract_userA_name: this.member.e_contract_userA_name, // 协议甲方
+          e_contract_userA_contacts_name: this.member.e_contract_userA_contacts_name, // 协议甲方联系人
+          e_contract_userA_contacts_tel: this.member.e_contract_userA_contacts_tel, // 协议甲方联系方式
+          e_contract_userA_contacts_address: this.member.e_contract_userA_contacts_address, // 协议甲方联系地址
+          e_contract_userB_contacts_name: this.member.e_contract_userB_contacts_name, // 协议乙方联系人
+          e_contract_remark: this.member.e_contract_remark, // 协议备注
         }
         if (this.returnMyReceivable) {
           this.urlReq('/order/updateBigOrder', obj)
@@ -2312,11 +2414,13 @@ export default {
         })
 
         //签约主体
-        this.$nextTick(() => {
-          this.$refs.casRef2.values = [res.signing_subject]
-          //合同地址
+        setTimeout(() => {
+          if (this.$refs.casRef2) {
+            this.$refs.casRef2.values = [res.signing_subject]
+          }
+          //归档协议地址
           this.$refs.uploadRef.contractData(contractRes.contract_file_name)
-        })
+        }, 200)
         this.member.contractUrl = contractRes.contract_file_url
         this.curIds = filterData.serversId ? filterData.serversId.split(',').map(Number) : []
 
@@ -2335,6 +2439,11 @@ export default {
         }
         // 补充包列表
         this.supplys = filterData.supplys
+
+        let saleMoney = {}
+        if (res.salesperson && res.saleMoney) {
+          saleMoney = JSON.parse(res.saleMoney)
+        }
         this.member = {
           orderCode: res.order_code, //
           createTime: res.create_time, //
@@ -2385,7 +2494,16 @@ export default {
           areaCount: filterData.areaCount,
           payType: res.payTypes,
           saleCodeModel: res.saleDep,
-          saleMoney: res.salesperson?JSON.parse(res.saleMoney):{},
+          saleMoney: saleMoney,
+          // 电子协议相关
+          e_contract_type: contractRes.seal_type || 1, // 电子协议类型
+          e_contract_userA_type: contractRes.partyA_type || 1, // 协议甲方类型
+          e_contract_userA_name: contractRes.partyA_name, // 协议甲方
+          e_contract_userA_contacts_name: contractRes.partyA_person, // 协议甲方联系人
+          e_contract_userA_contacts_tel: contractRes.partyA_tel, // 协议甲方联系方式
+          e_contract_userA_contacts_address: contractRes.partyA_address, // 协议甲方联系地址
+          e_contract_userB_contacts_name: contractRes.partyB_person, // 协议乙方联系人
+          e_contract_remark: contractRes.remark, // 协议备注
         }
         if (this.member.cycleType === 1) {
           this.max_length = 4
@@ -2413,21 +2531,11 @@ export default {
               this.$refs.uploadRef.payHtml = ''
             }
           }, 200)
-          this.$request('/order/getCombo').data().success((res) => {
-            this.levelDown = []
-            res.data.lists.forEach(v => {
-              if (v.id == filterData.comboId) {
-                this.member.level = JSON.stringify(v)
-                this.leChange(JSON.stringify(v), false)
-
-              }
-              
-                if (v.id !== 4) {// 试用版
-                  this.levelDown.push(v)
-                }
-            })
-      
-          }).get()
+          const currentLevel = this.levelDown.find(e => e.id == filterData.comboId)
+          if (currentLevel) {
+            this.member.level = JSON.stringify(currentLevel)
+            this.leChange(JSON.stringify(currentLevel), false)
+          }
         } else {
           let obj = {
             i_ispreinstall: 0,
@@ -2563,7 +2671,16 @@ export default {
         single:false, // 大会员商机版2.0-单省版 radio 选中状态
         areaCount:'0', // 大会员省份版-省份数量
         payType: '',
-        saleCodeModel: []
+        saleCodeModel: [],
+        // 电子协议相关
+        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: '', // 协议备注
       },
       isAll: false,
       radioDis1: false,
@@ -2578,7 +2695,7 @@ export default {
       rowArr: {},
       agreeStatus: [
         {v: '0', n: '不签协议'},
-        {v: '1', n: '签协议'}
+        {v: '1', n: '签协议'}
       ],
       payTypes: [
           {v: 'transferAccounts', n: '对公转账'},
@@ -3205,32 +3322,30 @@ export default {
 <style lang="scss">
 .disabled-modal {
 
-.readonly-scroll {
-  max-height: 40vh;
-  min-height: 300px;
-  overflow-y: scroll;
-  position: relative;
-  border: unset;
-  overflow-x: hidden;
-}
-
-.ivu-form.mainDetail {
-  position: relative;
+  .readonly-scroll {
+    max-height: 40vh;
+    min-height: 300px;
+    overflow-y: scroll;
+    position: relative;
+    border: unset;
+    overflow-x: hidden;
+  }
 
-&
-::after {
-  content: "";
-  position: absolute;
-  top: -8px;
-  left: -5px;
-  width: 102%;
-  height: 102%;
-  border-radius: 10px;
-  background-color: rgba(225, 225, 225, 0.0);
-  display: inline-block;
-  z-index: 99999999;
-}
+  .ivu-form.mainDetail {
+    position: relative;
 
-}
+    &::after {
+      content: "";
+      position: absolute;
+      top: -8px;
+      left: -5px;
+      width: 102%;
+      height: 102%;
+      border-radius: 10px;
+      background-color: rgba(225, 225, 225, 0.0);
+      display: inline-block;
+      z-index: 99999999;
+    }
+  }
 }
 </style>

+ 5 - 5
src/views/order/components/detailModel.vue

@@ -92,12 +92,12 @@
           <Button size="large" @click="backCancel">取消</Button>
       </div>
     </Modal>
-    <!-- 上传合同 -->
-    <Modal title="上传合同" v-model="pShow" class-name="order-model contract-model" :mask-closable="false" @on-visible-change="visibleChange">
+    <!-- 上传归档协议 -->
+    <Modal title="上传归档协议" v-model="pShow" class-name="order-model contract-model" :mask-closable="false" @on-visible-change="visibleChange">
       <b-upload 
         ref="uploadRef2" 
         @fileData="contractFile" 
-        :placeholdered="'请上传合同'" 
+        :placeholdered="'请上传归档协议'" 
         :accepted="'.doc,.pdf,.docx,.rar,.zip,.jpg,.png,.jpeg'"
         :formated="['doc','pdf','docx','rar','zip','jpg','png','jpeg']"
         :multipled="false"
@@ -326,9 +326,9 @@ export default {
     backCancel() {
       this.backShow = false
     },
-    pingSub() {// 上传合同
+    pingSub() {// 上传归档协议
       if (!this.contract.contractFileUrl) {
-        this.$Message.warning('请上传合同')
+        this.$Message.warning('请上传归档协议')
         return
       }
       this.isDisable = true

+ 104 - 12
src/views/order/components/details.vue

@@ -477,10 +477,25 @@
                     <span><p>客户名称:</p>{{contractData?contractData.customer_name?contractData.customer_name:'--':'--'}}</span>
                     <span><p>协议签订时间:</p>{{contractData?contractData.contract_status==0?'--':contractData.contract_time=='1970-01-01 08:00:00'?'--':contractData.contract_time:'--'}}</span>
                     <span><p>协议编号:</p>{{contractData?contractData.contract_status==0?'--':contractData.contract_code?contractData.contract_code:'--':'--'}}</span>
-                    <span><p>协议状态:</p>{{contractData?contractData.contract_status==1?'已签协议':contractData.contract_status==0?'不签协议':'--':'--'}}</span>
+                    <span><p>协议状态:</p>{{contractData?contractData.contract_status==1?'签协议':contractData.contract_status==0?'不签协议':'--':'--'}}</span>
+
+                    <span><p>电子协议类型:</p>{{contractData?contractData.seal_type==1?'有电子章':contractData.seal_type==2?'无电子章':'--':'--'}}</span>
+                    <span><p>协议甲方类型:</p>{{contractData?contractData.partyA_type==1?'个人':contractData.partyA_type==2?'企业':'--':'--'}}</span>
+                    <span><p>协议甲方:</p>{{contractData?contractData.partyA_name?contractData.partyA_name:'--':'--'}}</span>
+                    <span><p>协议甲方联系人:</p>{{contractData?contractData.partyA_person?contractData.partyA_person:'--':'--'}}</span>
+                    <span><p>协议甲方联系方式:</p>{{contractData?contractData.partyA_tel?contractData.partyA_tel:'--':'--'}}</span>
+                    <span><p>协议甲方联系地址:</p>{{contractData?contractData.partyA_address?contractData.partyA_address:'--':'--'}}</span>
+                    <span><p>协议乙方联系人:</p>{{contractData?contractData.partyB_person?contractData.partyB_person:'--':'--'}}</span>
+                    <span><p>协议备注:</p>{{contractData?contractData.remark?contractData.remark:'--':'--'}}</span>
+
                     <span><p>协议归档状态:</p> {{contractData.contract_archive_status | contract_archive_status}}</span>
                     <span><p>归档时间:</p> {{contractData.contract_archive_time || '--'}}</span>
                     <span><p>归档份数:</p> {{contractData.contract_archive_num || '--'}}</span>
+                    <span v-if="(book.source == 'qmx'|| !returnMyReceivable)&&contractDis && (orDetails.order_status !== -2 && orDetails.order_status !== '已取消')">
+                        <p>归档协议:</p>
+                        <a @click="downContract" v-if="contractData.contract_file_name">{{ contractData.contract_file_name || '--' }}</a>
+                        <span v-else>--</span>
+                    </span>
                 </div>
             </div>
             <Divider />
@@ -510,14 +525,14 @@
             </div>
             <Divider />
         </div>
-        <!-- 备注 -->
+        <!-- 订单备注 -->
         <div class="infor-card" v-if="book.source == 'qmx'">
             <div class="cont">
-                <div class="tit">备注</div>
+                <div class="tit">订单备注</div>
                 <div class="classfity">
                     <span>
                         <div class="shou" v-if="book.remark">{{book.remark}}</div>
-                        <i v-else style="color:#888">暂无备注</i>
+                        <i v-else style="color:#888">暂无订单备注</i>
                     </span>
                 </div>
             </div>
@@ -560,22 +575,23 @@
             <Button v-else-if="returnMyReceivable"  class="ping-btn" type="success" size="large" @click="pushInvo" >线下开发票</Button>
             <Button v-if="isShowCustom"  class="ping-btn" type="success" size="large" @click="scanCodeVote" >客户自助扫码开票</Button>
             <Button v-else disabled class="ping-btn" type="success" size="large">客户自助扫码开票</Button>
+            <Button class="ping-btn" type="primary" size="large" :disabled="cannotDownloadEContract" :loading="loading.eContract" @click="downloadEContract">下载电子协议</Button>
             <Button
                 class="ping-btn"
                 type="success"
                 size="large"
                 @click="uploadP"
                 v-if="returnMyReceivable &&(book.source == 'qmx' && (orDetails.order_status !== -2 && orDetails.order_status !== '已取消'))&&orDetails.audit_status===3"
-            >上传合同</Button>
-            <Button v-else-if="returnMyReceivable" class="ping-btn" type="success" size="large" disabled >上传合同</Button>
-            <Button
+            >上传归档协议</Button>
+            <Button v-else-if="returnMyReceivable" class="ping-btn" type="success" size="large" disabled >上传归档协议</Button>
+            <!-- <Button
                 class="ping-btn"
                 type="success"
                 size="large"
                 @click="downContract"
                 v-if="(book.source == 'qmx'|| !returnMyReceivable)&&contractDis && (orDetails.order_status !== -2 && orDetails.order_status !== '已取消')"
-            >下载合同</Button>
-            <Button class="ping-btn" type="success" size="large" disabled v-else>下载合同</Button>
+            >下载归档协议</Button>
+            <Button class="ping-btn" type="success" size="large" disabled v-else>下载归档协议</Button> -->
             <Button class="shen-btn" type="primary" size="large" @click="audited" v-if="returnMyReceivable && courseDis">审核</Button>
             <Button class="shen-btn" type="primary" size="large" disabled v-else-if="returnMyReceivable">审核</Button>
             <Button class="tui-btn" size="small" type="error" @click="refund" v-if="returnMyReceivable && orderComp">退款</Button>
@@ -685,12 +701,39 @@ export default {
             uploadData: {
                 type: 'transferAccounts'
             },
+            loading: {
+                eContract: false,
+            },
             previousPage:'',
             showDialog: false,
             isShowCustom: false
         }
     },
     computed: {
+        // 禁止下载电子协议
+        cannotDownloadEContract () {
+            if (!this.orDetails || !this.contractData) {
+                return true
+            }
+            const { filterData, res } = this.orders || {}
+            if (!filterData || !res) {
+                return true
+            }
+            // 1. 订单审核状态是“已通过”
+            const orderPass = this.orDetails.audit_status == 3
+            // 2. 签约主体为“北京剑鱼信息技术有限公司”
+            const partyBPass = this.orDetails.return_commpany == '北京剑鱼信息技术有限公司' || this.orDetails.signing_subject === 'h01' // 签约主体为:北京剑鱼信息技术有限公司/h01'
+            // 3. 协议状态为“签协议”
+            const contrastStatus = this.contractData.contract_status == 1
+            // 4. 产品类型是“超级订阅”(且付费类型为“购买”、“续费”),或产品类型是“大会员”且会员套餐为“商机版2.0”、“专家版2.0”(且服务类型为“新购服务”、“延长服务”)
+            // 购买时,vip_type为空null
+            const vipBuyOrRenew = res.productType == 'VIP订阅' && (res.vip_type === null || res.vip_type === undefined || res.vip_type == '1')
+            const bigBuyOrRenew = res.productType == '大会员' && (filterData.comboId == 6 || filterData.comboId == 7) && (filterData.createType == '1' || filterData.createType == '3')
+            const productionTypePass = vipBuyOrRenew || bigBuyOrRenew
+            // 可下载
+            const canDownload = orderPass && partyBPass && contrastStatus && productionTypePass
+            return !canDownload
+        },
         courseDis () {
           if (this.orDetails.course_status == 2) {
               if (this.orDetails.order_status == '未支付') {
@@ -785,7 +828,56 @@ export default {
         this.ordered()
     },
     methods: {
-        // 判断客户是否可以自助扫码开票
+        // 文件下载,跨域无效
+        downloadFile (url, filename) {
+            const link = document.createElement('a')
+            link.download = filename
+            link.href = url
+            link.click()
+        },
+        // 下载电子协议
+        downloadEContract () {
+            this.loading.eContract = true
+            this.$request('/order/GetContractPdf').data({ orderCode: this.orDetails.order_code }).success((res) => {
+                this.loading.eContract = false
+                if (res.status === 'success') {
+                    const fileUrl = res.data
+                    const filename = this.getEContractFilename(fileUrl)
+                    this.downloadFile(fileUrl, filename)
+                }
+            }).error(() => {
+                this.loading.eContract = false
+                console.log('下载电子协议失败')
+            }).post()
+        },
+        // 获取url中文件后缀doc/docx/pdf等
+        getFileExtension(url) {
+            const filename = url.substring(url.lastIndexOf('/') + 1);
+            const extension = filename.split('.').pop();
+            return extension;
+        },
+        // 计算电子协议文件名
+        getEContractFilename (url) {
+            // 超级订阅:剑鱼标讯超级订阅产品服务协议书(XX),XX为甲方名称
+            // 大会员:剑鱼标讯大会员产品服务协议书(XX),XX为甲方名称
+            const { res } = this.orders || {}
+            if (!res || !this.contractData) {
+                return true
+            }
+            let productTypeName = res.productType
+            if (productTypeName == 'VIP订阅') {
+                productTypeName = '超级订阅'
+            }
+            // 甲方名称
+            const partyAName = this.contractData.partyA_name
+            const suffix = this.getFileExtension(url)
+            const nameList = [`剑鱼标讯${productTypeName}产品服务协议书`]
+            if (partyAName) {
+                nameList.push(`(${partyAName})`)
+            }
+            nameList.push(`.${suffix}`)
+            return nameList.join('')
+        },
         isCanInvoice() {
           this.$request('/order/orderInfo').data({ orderCode: this.orDetails.order_code }).success((res) => {
             if (res.status === 'success') {
@@ -929,7 +1021,7 @@ export default {
                 this.returnInfo = r.data.returnInfo?r.data.returnInfo[0]:[]
                 this.book = r.data.filterData
                 this.$refs.othersReviewRecord.recordList = r.data.audit
-                if (r.data.res.salesperson) {
+                if (r && r.data && r.data.res && r.data.res.salesperson && r.data.res.saleMoney) {
                     this.saleTableData = JSON.parse(r.data.res.saleMoney).data
                 }
                 if (r.data.filterData.area) {
@@ -1006,7 +1098,7 @@ export default {
         },
         downContract() {
             this.$Modal.confirm({
-                title: "确定下载该合同吗?",
+                title: "确定下载该归档协议吗?",
                 onOk: () => {// 文件下载
                     const a1 = document.createElement('a')
                     a1.download = this.contractData.contract_file_name

+ 141 - 55
src/views/order/components/otherOrder.vue

@@ -37,6 +37,12 @@
               @on-keyup="pheHandler"
           ></Input>
         </FormItem>
+        <FormItem label="公司名称" :required="others.buySubject == '2'">
+          <Input v-model.trim="others.companyName" type="text" :maxlength="40" placeholder="请输入公司名称"></Input>
+        </FormItem>
+        <FormItem label="客户名称">
+          <Input v-model="others.customerName" type="text" :maxlength="40" placeholder="请输入客户名称"></Input>
+        </FormItem>
         <FormItem label="产品类型" required>
           <Select v-model="others.productType" placeholder="请选择产品类型" @on-change="goodChange">
             <Option v-for="item in otherPro" :value="item.v" :key="item.v">{{ item.n }}</Option>
@@ -57,12 +63,6 @@
         <FormItem label="购买数量" required  v-show="others.buySubject == '2'&&others.productType == '5'">
             <Input v-model="others.buyCount" type="tel" maxlength="4" @on-keyup="buyHandler" placeholder="请填写购买数量"></Input>
         </FormItem>
-        <FormItem label="公司名称" :required="others.buySubject == '2'">
-          <Input v-model.trim="others.companyName" type="text" :maxlength="40" placeholder="请输入公司名称"></Input>
-        </FormItem>
-        <FormItem label="客户名称">
-          <Input v-model="others.customerName" type="text" :maxlength="40" placeholder="请输入客户名称"></Input>
-        </FormItem>
         <FormItem label="购买省份" required v-show="others.productType == '5'">
           <city-select ref="cityArea" :stopCheck="stopCheck" @provinceSel="provinceSel"></city-select>
           <div v-show="others.vipType=='1'||others.vipType=='2'" style="color:#ed4014;font-size:13px;line-height:20px">
@@ -111,41 +111,6 @@
             </Select>
           </FormItem>
         </div>
-        <FormItem label="协议状态" required>
-          <Select v-model="others.contractStatus" placeholder="请选择协议状态">
-            <Option v-for="item in agreeStatus" :value="item.v" :key="item.v">{{ item.n }}</Option>
-          </Select>
-        </FormItem>
-        <FormItem label="签约主体" required>
-          <v-cascader ref="casRef2" :initVal="'h01'" placeholderType="请选择签约主体" reqType="签约主体"
-                      @levelChange="paybackChange" v-if="oShow"></v-cascader>
-        </FormItem>
-        <FormItem label="约定支付方式" required>
-          <Select v-model="others.payType" placeholder="请选择约定支付方式">
-            <Option v-for="item in payTypes" :value="item.v" :key="item.v">{{ item.n }}</Option>
-          </Select>
-        </FormItem>
-        <FormItem label="协议签订时间" v-if="others.contractStatus == '1'">
-          <date-sigle ref="sigleRef2" :dateType="'date'" :placeholderd="'请选择协议签订时间'" @startDate="agreeDate"
-                      :overTime="0"></date-sigle>
-        </FormItem>
-        <FormItem label="协议编号" v-if="others.contractStatus == '1'">
-          <Input v-model="others.contractCode" type="text" placeholder="请输入协议编号"></Input>
-        </FormItem>
-        <FormItem label="协议归档状态" v-if="others.contractStatus == '1'">
-          <Select v-model="others.contract_archive_status" placeholder="请选择协议状态">
-            <Option value="0">未归档</Option>
-            <Option value="1">已归档</Option>
-          </Select>
-        </FormItem>
-        <FormItem label="归档时间" v-if="others.contractStatus == '1'&&others.contract_archive_status == '1'">
-          <date-sigle ref="sigleRef5" :dateType="'date'" :placeholderd="'请选择归档时间'" @startDate="guiDate"
-                      :overTime="0"></date-sigle>
-        </FormItem>
-        <FormItem label="归档份数" v-if="others.contractStatus == '1'&&others.contract_archive_status == '1'">
-          <Input v-model="others.contract_archive_num" type="tel" maxlength="4" @on-keyup="payHandler"
-                 placeholder="请输入归档份数"></Input>
-        </FormItem>
         <FormItem label="购买产品" v-if="others.productType == '2'">
           <Select v-model="others.product" placeholder="请选择购买产品">
             <Option v-for="item in buyPro" :value="item.v" :key="item.v">{{ item.n }}</Option>
@@ -219,11 +184,62 @@
               @on-keyup="keyupSale('4')"
           ></Input>
         </FormItem>
-        <FormItem label="合同" class="chuan-pay">
+        <FormItem label="约定支付方式" required>
+          <Select v-model="others.payType" placeholder="请选择约定支付方式">
+            <Option v-for="item in payTypes" :value="item.v" :key="item.v">{{ item.n }}</Option>
+          </Select>
+        </FormItem>
+        <FormItem label="签约主体" required>
+          <v-cascader ref="casRef2" :initVal="'h01'" placeholderType="请选择签约主体" reqType="签约主体"
+                      @levelChange="paybackChange" v-if="oShow"></v-cascader>
+        </FormItem>
+        <FormItem label="协议状态" required>
+          <Select v-model="others.contractStatus" placeholder="请选择协议状态">
+            <Option v-for="item in agreeStatus" :value="item.v" :key="item.v">{{ item.n }}</Option>
+          </Select>
+        </FormItem>
+        <OnlineContractForm
+          ref="onlineContractFormRef"
+          v-if="showOnlineContractForm"
+          :buySubject="others.buySubject"
+          :orderEntName="others.companyName"
+          :orderPhone="others.phone"
+          :sellerName="others.salesPerson"
+          :e_contract_type.sync="others.e_contract_type"
+          :e_contract_userA_type.sync="others.e_contract_userA_type"
+          :e_contract_userA_name.sync="others.e_contract_userA_name"
+          :e_contract_userA_contacts_name.sync="others.e_contract_userA_contacts_name"
+          :e_contract_userA_contacts_tel.sync="others.e_contract_userA_contacts_tel"
+          :e_contract_userA_contacts_address.sync="others.e_contract_userA_contacts_address"
+          :e_contract_userB_contacts_name.sync="others.e_contract_userB_contacts_name"
+          :e_contract_remark.sync="others.e_contract_remark"
+        />
+        <FormItem label="协议签订时间" v-if="others.contractStatus == '1'">
+          <date-sigle ref="sigleRef2" :dateType="'date'" :placeholderd="'请选择协议签订时间'" @startDate="agreeDate"
+                      :overTime="0"></date-sigle>
+        </FormItem>
+        <FormItem label="协议编号" v-if="others.contractStatus == '1' && !showOnlineContractForm">
+          <Input v-model="others.contractCode" type="text" placeholder="请输入协议编号"></Input>
+        </FormItem>
+        <FormItem label="协议归档状态" v-if="others.contractStatus == '1'">
+          <Select v-model="others.contract_archive_status" placeholder="请选择协议状态">
+            <Option value="0">未归档</Option>
+            <Option value="1">已归档</Option>
+          </Select>
+        </FormItem>
+        <FormItem label="归档时间" v-if="others.contractStatus == '1'&&others.contract_archive_status == '1'">
+          <date-sigle ref="sigleRef5" :dateType="'date'" :placeholderd="'请选择归档时间'" @startDate="guiDate"
+                      :overTime="0"></date-sigle>
+        </FormItem>
+        <FormItem label="归档份数" v-if="others.contractStatus == '1'&&others.contract_archive_status == '1'">
+          <Input v-model="others.contract_archive_num" type="tel" maxlength="4" @on-keyup="payHandler"
+                 placeholder="请输入归档份数"></Input>
+        </FormItem>
+        <FormItem label="归档协议" class="chuan-pay">
           <b-upload
               ref="uploadRef"
               @fileData="contractFile"
-              :placeholdered="'请上传合同'"
+              :placeholdered="'请上传归档协议'"
               :accepted="'.doc,.pdf,.docx,.rar,.zip,.jpg,.png,.jpeg'"
               :formated="['doc','pdf','docx','rar','zip','jpg','png','jpeg']"
               :multipled="false"
@@ -252,8 +268,8 @@
           <date-sigle ref="sigleRef4" :dateType="'date'" :dataV="others.sale_time" :placeholderd="'请选择业绩统计时间'"
                       @startDate="saleDate" :overTime="0"></date-sigle>
         </FormItem>
-        <FormItem label="备注">
-          <Input v-model="others.remark" type="text" :maxlength="40" placeholder="请输入备注"></Input>
+        <FormItem label="订单备注">
+          <Input v-model="others.remark" type="text" :maxlength="40" placeholder="请输入订单备注"></Input>
         </FormItem>
       </Form>
       <div slot="footer">
@@ -273,11 +289,13 @@ import fDate from '@/components/dateSection'
 import bUpload from '@/components/uploadFile.vue'
 import citySelect from "@/components/citySelect"
 import saleSelect from './salesSelect.vue'
+import OnlineContractForm from '@/components/OnlineContractForm'
 import {dateFormatter} from '@/assets/js/date'
 
-
 export default {
+  name: 'CreateOtherOrderModal',
   components: {
+    OnlineContractForm,
     dateSigle,
     vCascader,
     fDate,
@@ -291,6 +309,20 @@ export default {
       default: false
     }
   },
+  computed: {
+    showOnlineContractForm () {
+      const paybackCompanyCheck = this.others.paybackCompany == 'h01' // 签约主体为:北京剑鱼信息技术有限公司/h01
+      const contractStatusCheck = this.others.contractStatus == '1' // 协议状态为签协议
+      // 展示条件:
+      // 1. 产品类型是超级订阅(且付费类型为“购买”、“续费”)才展示。
+      // 2. 产品类型是“大会员”且会员套餐为“商机版2.0”、“专家版2.0”(且服务类型为“新购服务”、“延长服务”)
+      // productType=5即超级订阅,此处创建其他订单无大会员选项,此处不考虑大会员
+      const vipBuyOrRenew = this.others.productType == '5' && (this.others.vipType == '0' || this.others.vipType == '1')
+      const productTypeCheck = vipBuyOrRenew
+      return paybackCompanyCheck && contractStatusCheck && productTypeCheck
+    }
+  },
+  created () {},
   methods: {
     inited() {// 初始化
       // this.$refs['others'].resetFields()
@@ -345,6 +377,9 @@ export default {
           this.others[key] = '1'
         } else if (key == 'contract_archive_status') {
           this.others[key] = '0'
+        } else if (key.startsWith('e_contract_')) {
+          // 默认重置
+          this.others[key] = this.$options.data().others[key]
         } else if (key!=='salesPerson'){
           this.others[key] = ''
         }
@@ -594,12 +629,12 @@ export default {
               this.$refs.cityArea.selectCitys = this.$refs.cityArea.selectCitys.concat(arrs1)
               this.others.area = String(arrs)
               this.stopCheck = false
-              this.others.companyName = ''
+              // this.others.companyName = ''
               this.others.customerName = ''
               this.$refs.sigleRef1.dataVals = ''
               this.others.vipStartTime = ''
             } else {
-              this.others.companyName = ''
+              // this.others.companyName = ''
               this.others.customerName = ''
               this.$refs.sigleRef1.dataVals = ''
               this.others.vipStartTime = ''
@@ -734,10 +769,43 @@ export default {
         return
        }
       }
-      // if (!this.others.companyName) {
-      //   this.$Notice.warning({title: '请输入公司名称'})
-      //   return
-      // }
+
+      if (this.showOnlineContractForm) {
+        // 如购买主体或甲方类型为“企业”,则公司名称必填
+        const entMark = this.others.buySubject == '2' || this.others.e_contract_userA_type == 2
+        if (entMark && !this.others.companyName) {
+          this.$Notice.warning({title: '公司名称必填'})
+          return
+        }
+        if (!this.others.e_contract_type) {
+          this.$Notice.warning({title: '电子协议类型必填'})
+          return
+        }
+        if (!this.others.e_contract_userA_type) {
+          this.$Notice.warning({title: '协议甲方类型必填'})
+          return
+        }
+        if (!this.others.e_contract_userA_name) {
+          this.$Notice.warning({title: '协议甲方必填'})
+          return
+        }
+        if (!this.others.e_contract_userA_contacts_name) {
+          this.$Notice.warning({title: '协议甲方联系人必填'})
+          return
+        }
+        if (!this.others.e_contract_userA_contacts_tel) {
+          this.$Notice.warning({title: '协议甲方联系方式必填'})
+          return
+        }
+        if (!this.others.e_contract_userA_contacts_address) {
+          this.$Notice.warning({title: '协议甲方联系地址必填'})
+          return
+        }
+        if (!this.others.e_contract_userB_contacts_name) {
+          this.$Notice.warning({title: '协议乙方联系人必填'})
+          return
+        }
+      }
       if (!this.others.salesChannel) {
         this.$Notice.warning({title: '请选择销售渠道'})
         return
@@ -929,7 +997,16 @@ export default {
         salesPersonId: saleId,
         saleDep: this.saleCode,
         payType: this.others.payType,
-        saleMoney: JSON.stringify({data: this.saleTableData})
+        saleMoney: JSON.stringify({data: this.saleTableData}),
+        // 电子协议相关
+        e_contract_type: this.others.e_contract_type, // 电子协议类型
+        e_contract_userA_type: this.others.e_contract_userA_type, // 协议甲方类型
+        e_contract_userA_name: this.others.e_contract_userA_name, // 协议甲方
+        e_contract_userA_contacts_name: this.others.e_contract_userA_contacts_name, // 协议甲方联系人
+        e_contract_userA_contacts_tel: this.others.e_contract_userA_contacts_tel, // 协议甲方联系方式
+        e_contract_userA_contacts_address: this.others.e_contract_userA_contacts_address, // 协议甲方联系地址
+        e_contract_userB_contacts_name: this.others.e_contract_userB_contacts_name, // 协议乙方联系人
+        e_contract_remark: this.others.e_contract_remark, // 协议备注
       }
       var urlVue = ``
       if (this.showOrderStatus) {
@@ -1066,7 +1143,16 @@ export default {
         contract_archive_time: '',
         contract_archive_num: '',
         payType: '',
-        saleCodeModel: []
+        saleCodeModel: [],
+        // 电子协议相关
+        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: '', // 协议备注
       },
       otherPro: [
         {v: '1', n: '广告'},
@@ -1090,7 +1176,7 @@ export default {
       ],
       agreeStatus: [
         {v: '0', n: '不签协议'},
-        {v: '1', n: '签协议'}
+        {v: '1', n: '签协议'}
       ],
       payTypes: [
           {v: 'transferAccounts', n: '对公转账'},

+ 178 - 76
src/views/order/components/otherOrderEdit.vue

@@ -46,6 +46,12 @@
                 :disabled="interested"
             ></Input>
           </FormItem>
+          <FormItem label="公司名称" prop="" :required="others.buySubject == '2'">
+            <Input v-model.trim="others.companyName" type="text" :maxlength="40" :disabled="finish_dis" placeholder="请输入公司名称"></Input>
+          </FormItem>
+          <FormItem label="客户名称">
+            <Input v-model="others.customerName" type="text" :maxlength="40" placeholder="请输入客户名称"></Input>
+          </FormItem>
           <FormItem label="产品类型" prop="productType">
             <!-- <FormItem label="产品类型" prop="productType">
   -                  <Select v-model="others.productType" placeholder="请选择产品类型" @on-change="goodChange" :disabled="interested"> -->
@@ -70,12 +76,6 @@
           <FormItem label="购买数量" required v-show="others.buySubject == '2' && others.productType == '5'">
             <Input v-model="others.buyCount" type="tel" maxlength="4" @on-keyup="buyHandler" placeholder="请填写购买数量" :disabled="finish_dis"></Input>
           </FormItem>
-          <FormItem label="公司名称" prop="" :required="others.buySubject == '2'">
-            <Input v-model.trim="others.companyName" type="text" :maxlength="40" :disabled="finish_dis" placeholder="请输入公司名称"></Input>
-          </FormItem>
-          <FormItem label="客户名称">
-            <Input v-model="others.customerName" type="text" :maxlength="40" placeholder="请输入客户名称"></Input>
-          </FormItem>
           <FormItem label="购买省份" prop="area" v-show="others.productType == '5'">
             <city-select ref="cityArea" :stopCheck="stopCheck" @provinceSel="provinceSel"></city-select>
             <div v-show="others.vipType=='1'||others.vipType=='2'"
@@ -125,41 +125,6 @@
               </Select>
             </FormItem>
           </div>
-          <FormItem label="协议状态" prop="contractStatus">
-            <Select v-model="others.contractStatus" placeholder="请选择协议状态">
-              <Option v-for="item in agreeStatus" :value="item.v" :key="item.v">{{ item.n }}</Option>
-            </Select>
-          </FormItem>
-          <FormItem label="签约主体" prop="paybackCompany">
-            <v-cascader ref="casRef2" :initVal="'h01'" :disabled="finish_dis" placeholderType="请选择签约主体" reqType="签约主体"
-                        @levelChange="paybackChange" v-if="oShow"></v-cascader>
-          </FormItem>
-          <FormItem label="约定支付方式" prop="payType" required>
-            <Select v-model="others.payType" placeholder="请选择约定支付方式" :disabled="finish_dis">
-              <Option v-for="item in payTypes" :value="item.v" :key="item.v">{{ item.n }}</Option>
-            </Select>
-          </FormItem>
-          <FormItem label="协议签订时间" v-show="others.contractStatus == '1'">
-            <date-sigle ref="sigleRef2" :dateType="'date'" :placeholderd="'请选择协议签订时间'" @startDate="agreeDate"
-                        :overTime="0"></date-sigle>
-          </FormItem>
-          <FormItem label="协议编号" v-if="others.contractStatus == '1'">
-            <Input v-model="others.contractCode" type="text" placeholder="请输入协议编号"></Input>
-          </FormItem>
-          <FormItem label="协议归档状态" v-if="others.contractStatus == '1'">
-            <Select v-model="others.contract_archive_status" placeholder="请选择协议状态">
-              <Option value="0">未归档</Option>
-              <Option value="1">已归档</Option>
-            </Select>
-          </FormItem>
-          <FormItem label="归档时间" v-show="others.contractStatus == '1'&&others.contract_archive_status == '1'">
-            <date-sigle ref="sigleRef5" :dateType="'date'" :placeholderd="'请选择归档时间'" @startDate="guiDate"
-                        :overTime="0"></date-sigle>
-          </FormItem>
-          <FormItem label="归档份数" v-if="others.contractStatus == '1'&&others.contract_archive_status == '1'">
-            <Input v-model="others.contract_archive_num" type="tel" maxlength="4" @on-keyup="payHandler"
-                   placeholder="请输入归档份数"></Input>
-          </FormItem>
           <FormItem label="购买产品" v-if="others.productType == '2'">
             <Select v-model="others.product" placeholder="请选择购买产品">
               <Option v-for="item in buyPro" :value="item.v" :key="item.v">{{ item.n }}</Option>
@@ -237,11 +202,62 @@
                 :disabled="finish_dis"
             ></Input>
           </FormItem>
-          <FormItem label="合同" class="chuan-pay">
+          <FormItem label="约定支付方式" prop="payType" required>
+            <Select v-model="others.payType" placeholder="请选择约定支付方式" :disabled="finish_dis">
+              <Option v-for="item in payTypes" :value="item.v" :key="item.v">{{ item.n }}</Option>
+            </Select>
+          </FormItem>
+          <FormItem label="签约主体">
+            <v-cascader ref="casRef2" :initVal="'h01'" :disabled="finish_dis" placeholderType="请选择签约主体" reqType="签约主体"
+                        @levelChange="paybackChange" v-if="oShow"></v-cascader>
+          </FormItem>
+          <FormItem label="协议状态" prop="contractStatus">
+            <Select v-model="others.contractStatus" placeholder="请选择协议状态">
+              <Option v-for="item in agreeStatus" :value="item.v" :key="item.v">{{ item.n }}</Option>
+            </Select>
+          </FormItem>
+          <OnlineContractForm
+            ref="onlineContractFormRef"
+            v-if="showOnlineContractForm"
+            :buySubject="others.buySubject"
+            :orderEntName="others.companyName"
+            :orderPhone="others.phone"
+            :sellerName="others.salesPerson"
+            :e_contract_type.sync="others.e_contract_type"
+            :e_contract_userA_type.sync="others.e_contract_userA_type"
+            :e_contract_userA_name.sync="others.e_contract_userA_name"
+            :e_contract_userA_contacts_name.sync="others.e_contract_userA_contacts_name"
+            :e_contract_userA_contacts_tel.sync="others.e_contract_userA_contacts_tel"
+            :e_contract_userA_contacts_address.sync="others.e_contract_userA_contacts_address"
+            :e_contract_userB_contacts_name.sync="others.e_contract_userB_contacts_name"
+            :e_contract_remark.sync="others.e_contract_remark"
+          />
+          <FormItem label="协议签订时间" v-show="others.contractStatus == '1'">
+            <date-sigle ref="sigleRef2" :dateType="'date'" :placeholderd="'请选择协议签订时间'" @startDate="agreeDate"
+                        :overTime="0"></date-sigle>
+          </FormItem>
+          <FormItem label="协议编号" v-if="others.contractStatus == '1' && !showOnlineContractForm">
+            <Input v-model="others.contractCode" type="text" placeholder="请输入协议编号"></Input>
+          </FormItem>
+          <FormItem label="协议归档状态" v-if="others.contractStatus == '1'">
+            <Select v-model="others.contract_archive_status" placeholder="请选择协议状态">
+              <Option value="0">未归档</Option>
+              <Option value="1">已归档</Option>
+            </Select>
+          </FormItem>
+          <FormItem label="归档时间" v-show="others.contractStatus == '1'&&others.contract_archive_status == '1'">
+            <date-sigle ref="sigleRef5" :dateType="'date'" :placeholderd="'请选择归档时间'" @startDate="guiDate"
+                        :overTime="0"></date-sigle>
+          </FormItem>
+          <FormItem label="归档份数" v-if="others.contractStatus == '1'&&others.contract_archive_status == '1'">
+            <Input v-model="others.contract_archive_num" type="tel" maxlength="4" @on-keyup="payHandler"
+                   placeholder="请输入归档份数"></Input>
+          </FormItem>
+          <FormItem label="归档协议" class="chuan-pay">
             <b-upload
                 ref="uploadRef"
                 @fileData="contractFile"
-                :placeholdered="'请上传合同'"
+                :placeholdered="'请上传归档协议'"
                 :accepted="'.doc,.pdf,.docx,.rar,.zip,.jpg,.png,.jpeg'"
                 :formated="['doc','pdf','docx','rar','zip','jpg','png','jpeg']"
                 :multipled="false"
@@ -269,8 +285,8 @@
             <date-sigle ref="sigleRef4" :dateType="'date'" :dataV="others.sale_time" :placeholderd="'请选择业绩统计时间'"
                         @startDate="saleDate" :overTime="0"></date-sigle>
           </FormItem>
-          <FormItem label="备注">
-            <Input v-model="others.remark" type="text" :maxlength="40" placeholder="请输入备注"></Input>
+          <FormItem label="订单备注">
+            <Input v-model="others.remark" type="text" :maxlength="40" placeholder="请输入订单备注"></Input>
           </FormItem>
         </Form>
       </div>
@@ -313,12 +329,15 @@ import fDate from '@/components/dateSection'
 import reviewRecord from './reviewRecord.vue'
 import bUpload from '@/components/uploadFile.vue'
 import citySelect from "@/components/citySelect"
+import OnlineContractForm from '@/components/OnlineContractForm'
 import saleSelect from './salesSelect.vue'
 import {dateFormatter} from '@/assets/js/date'
 import chinaMapJSON from "@/assets/js/china_area.js";
 
 export default {
+  name: 'EditOtherOrderModal',
   components: {
+    OnlineContractForm,
     dateSigle,
     vCascader,
     fDate,
@@ -338,6 +357,17 @@ export default {
     }
   },
   computed: {
+    showOnlineContractForm () {
+      const paybackCompanyCheck = this.others.paybackCompany == 'h01' // 签约主体为:北京剑鱼信息技术有限公司/h01
+      const contractStatusCheck = this.others.contractStatus == '1' // 协议状态为签协议
+      // 展示条件:
+      // 1. 产品类型是超级订阅(且付费类型为“购买”、“续费”)才展示。
+      // 2. 产品类型是“大会员”且会员套餐为“商机版2.0”、“专家版2.0”(且服务类型为“新购服务”、“延长服务”)
+      // productType=5即超级订阅,此处创建其他订单无大会员选项,此处不考虑大会员
+      const vipBuyOrRenew = this.others.productType == '5' && (this.others.vipType == '0' || this.others.vipType == '1')
+      const productTypeCheck = vipBuyOrRenew
+      return paybackCompanyCheck && contractStatusCheck && productTypeCheck
+    },
     returnMyOther: function () {
       let rout = this.$route.query
       if (rout.path && rout.path == 'my') {// 我的订单
@@ -413,6 +443,8 @@ export default {
           this.others[key] = '1'
         } else if (key == 'contract_archive_status') {
           this.others[key] = '0'
+        } else if (key.startsWith('e_contract_')) {
+          this.others[key] = this.$options.data().others[key]
         } else {
           this.others[key] = ''
         }
@@ -839,6 +871,50 @@ export default {
         return
        }
       }
+      // if (!this.others.companyName) {
+      //   this.$Notice.warning({title: '请输入公司名称'})
+      //   return
+      // }
+      // if (this.others.buySubject == '') {
+      //   this.$Notice.warning({title: '请选择购买主体'})
+      //   return
+      //  }
+      if (this.showOnlineContractForm) {
+        // 如购买主体或甲方类型为“企业”,则公司名称必填
+        const entMark = this.others.buySubject == '2' || this.others.e_contract_userA_type == 2
+        if (entMark && !this.others.companyName) {
+          this.$Notice.warning({title: '公司名称必填'})
+          return
+        }
+        if (!this.others.e_contract_type) {
+          this.$Notice.warning({title: '电子协议类型必填'})
+          return
+        }
+        if (!this.others.e_contract_userA_type) {
+          this.$Notice.warning({title: '协议甲方类型必填'})
+          return
+        }
+        if (!this.others.e_contract_userA_name) {
+          this.$Notice.warning({title: '协议甲方必填'})
+          return
+        }
+        if (!this.others.e_contract_userA_contacts_name) {
+          this.$Notice.warning({title: '协议甲方联系人必填'})
+          return
+        }
+        if (!this.others.e_contract_userA_contacts_tel) {
+          this.$Notice.warning({title: '协议甲方联系方式必填'})
+          return
+        }
+        if (!this.others.e_contract_userA_contacts_address) {
+          this.$Notice.warning({title: '协议甲方联系地址必填'})
+          return
+        }
+        if (!this.others.e_contract_userB_contacts_name) {
+          this.$Notice.warning({title: '协议乙方联系人必填'})
+          return
+        }
+      }
       if(this.others.productType == '5' && this.others.buySubject == '2'){
           if(this.others.buyCount == '')  {
                 this.$Notice.warning({title: '请输入购买数量'})
@@ -1013,7 +1089,17 @@ export default {
         salesPersonId: saleId,
         saleDep: this.saleCode,
         payType: this.others.payType,
-        saleMoney: JSON.stringify({data: this.saleTableData})
+        saleDep: this.saleCode,
+        saleMoney: JSON.stringify({data: this.saleTableData}),
+        // 电子协议相关
+        e_contract_type: this.others.e_contract_type, // 电子协议类型
+        e_contract_userA_type: this.others.e_contract_userA_type, // 协议甲方类型
+        e_contract_userA_name: this.others.e_contract_userA_name, // 协议甲方
+        e_contract_userA_contacts_name: this.others.e_contract_userA_contacts_name, // 协议甲方联系人
+        e_contract_userA_contacts_tel: this.others.e_contract_userA_contacts_tel, // 协议甲方联系方式
+        e_contract_userA_contacts_address: this.others.e_contract_userA_contacts_address, // 协议甲方联系地址
+        e_contract_userB_contacts_name: this.others.e_contract_userB_contacts_name, // 协议乙方联系人
+        e_contract_remark: this.others.e_contract_remark, // 协议备注
       }
       this.isDisable = true
       var submitUrl = ''
@@ -1143,7 +1229,7 @@ export default {
           this.$refs.casRef.setDate(res.distribution_channel)
         })
 
-        //合同地址
+        //归档协议地址
         this.$refs.uploadRef.contractData(contractRes.contract_file_name)
         this.others.contract_file_url = contractRes.contract_file_url
 
@@ -1171,7 +1257,7 @@ export default {
           }
         },1000)
         setTimeout( ()=>{
-          if (res.salesperson) {
+          if (res.salesperson && res.saleMoney) {
             this.saleTableData = JSON.parse(res.saleMoney).data
           }
         },2000)
@@ -1238,8 +1324,17 @@ export default {
             username: res.salesperson
           }), //
           // salesPersonId: res.salesperson_id //
+          payType: res.payTypes,  
           saleCodeModel: res.saleDep,
-          payType: res.payTypes
+          // 电子协议相关
+          e_contract_type: contractRes.seal_type || 1, // 电子协议类型
+          e_contract_userA_type: contractRes.partyA_type || 1, // 协议甲方类型
+          e_contract_userA_name: contractRes.partyA_name, // 协议甲方
+          e_contract_userA_contacts_name: contractRes.partyA_person, // 协议甲方联系人
+          e_contract_userA_contacts_tel: contractRes.partyA_tel, // 协议甲方联系方式
+          e_contract_userA_contacts_address: contractRes.partyA_address, // 协议甲方联系地址
+          e_contract_userB_contacts_name: contractRes.partyB_person, // 协议乙方联系人
+          e_contract_remark: contractRes.remark, // 协议备注
         }
         if (productType == "5") {
           this.checkVip(1)
@@ -1359,7 +1454,16 @@ export default {
         contract_archive_time: '',
         contract_archive_num: '',
         payType: '',
-        saleCodeModel: []
+        saleCodeModel: [],
+        // 电子协议相关
+        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: '', // 协议备注
       },
       ruleValidate: {
         phone: [{required: true}],
@@ -1404,7 +1508,7 @@ export default {
       ],
       agreeStatus: [
         {v: '0', n: '不签协议'},
-        {v: '1', n: '签协议'}
+        {v: '1', n: '签协议'}
       ],
       payTypes: [
           {v: 'transferAccounts', n: '对公转账'},
@@ -1445,33 +1549,31 @@ export default {
 <style lang="scss">
 .disabled-modal {
 
-.ivu-form.mainDetail {
-  position: relative;
+  .ivu-form.mainDetail {
+    position: relative;
 
-.readonly-scroll {
-  max-height: 40vh;
-  min-height: 300px;
-  overflow-y: scroll;
-  position: relative;
-  border: unset;
-  overflow-x: hidden;
-}
-
-&
-::after {
-  content: "";
-  position: absolute;
-  top: -8px;
-  left: -5px;
-  width: 102%;
-  height: 102%;
-  border-radius: 10px;
-  background-color: rgba(225, 225, 225, 0.0);
-  display: inline-block;
-  z-index: 99999999;
-}
+    .readonly-scroll {
+      max-height: 40vh;
+      min-height: 300px;
+      overflow-y: scroll;
+      position: relative;
+      border: unset;
+      overflow-x: hidden;
+    }
 
-}
+    &::after {
+      content: "";
+      position: absolute;
+      top: -8px;
+      left: -5px;
+      width: 102%;
+      height: 102%;
+      border-radius: 10px;
+      background-color: rgba(225, 225, 225, 0.0);
+      display: inline-block;
+      z-index: 99999999;
+    }
+  }
 }
 </style>
 

+ 0 - 6
src/views/order/components/salesSelect.vue

@@ -6,7 +6,6 @@
         multiple
         @on-open-change="openChange"
         @on-change="selChange"
-        @on-query-change="personChange"
         filterable
         clearable
         :disabled="dis"
@@ -62,11 +61,6 @@ export default {
         })
       }).post()
     },
-    personChange(val) {
-      if (val == '') {
-        this.salePerson = ''
-      }
-    },
     openChange(val) {
       if (val && this.flage) {
         this.personData()

+ 2 - 2
src/views/order/myOrderList.vue

@@ -66,7 +66,7 @@
                   maxlength="11"
                   style="width:105px;height:36px;margin: 0 10px 10px 2px;"
               ></Input>
-              <Select placeholder="是否上传合同" clearable v-model="filter.contractStatus" style="width:120px;margin:0 10px 10px 0">
+              <Select placeholder="是否上传归档协议" clearable v-model="filter.contractStatus" style="width:120px;margin:0 10px 10px 0">
                   <Option v-for="item in contractStas" :value="item.v" :key="item.v">{{ item.n }}</Option>
               </Select>
               <Input
@@ -693,7 +693,7 @@
                       }
                   },
                   {
-                      title: '是否上传合同',
+                      title: '是否上传归档协议',
                       key: 'filter',
                       align: 'center',
                       render: (h, {row}) => {

+ 2 - 2
src/views/order/orderList.vue

@@ -68,7 +68,7 @@
             maxlength="11"
             style="width:105px;height:36px;margin: 0 10px 10px 2px;"
         ></Input>
-        <Select placeholder="是否上传合同" clearable v-model="filter.contractStatus" style="width:120px;margin:0 10px 10px 0">
+        <Select placeholder="是否上传归档协议" clearable v-model="filter.contractStatus" style="width:120px;margin:0 10px 10px 0">
           <Option v-for="item in contractStas" :value="item.v" :key="item.v">{{ item.n }}</Option>
         </Select>
         <Input
@@ -464,7 +464,7 @@ export default {
           }
         },
         {
-          title: '是否上传合同',
+          title: '是否上传归档协议',
           key: 'filter',
           align: 'center',
           render: (h, {row}) => {