瀏覽代碼

Merge branch 'master' into feature/v2.4.28

lianbingjie 1 年之前
父節點
當前提交
b4e8636063

+ 17 - 4
src/components/OnlineContractForm.vue

@@ -5,6 +5,7 @@
         <!-- <legend class="online-contract-form-legend">电子协议表单</legend> -->
         <Form-item label="协议备注" :label-width="110">
             <Input
+                :disabled="hasDisabled && disabledFiled && disabledFiled.indexOf('e_contract_remark') > -1"
                 :value="e_contract_remark"
                 placeholder="请输入协议备注"
                 maxlength="180"
@@ -110,7 +111,19 @@
             showMore:{
                 type: Boolean,
                 default: true
+            },
+          // 是否有需要禁止的字段
+          hasDisabled: {
+            type: Boolean,
+            default: false
+          },
+          // 禁止的字段有哪些
+          disabledFiled: {
+            type: Array,
+            default: () => {
+              return []
             }
+          }
         },
         data () {
             return {
@@ -144,7 +157,7 @@
                     if (n === '2') {
                         // 订单购买主体变为企业时候,需要同步企业名
                         this.syncEntName(this.orderEntName)
-                       
+
                     }
                 }
             },
@@ -169,14 +182,14 @@
 
         },
         created () {
+          console.log(7777777777)
+          console.log(this.hasDisabled)
+          console.log(this.disabledFiled)
             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')
                 }

+ 5 - 5
src/components/citySelect.vue

@@ -4,7 +4,7 @@
         <ul>
           <li v-for="(item,i) in selectCitys" :key="item.id">
             <span>{{item.name}}</span>
-            <Icon type="md-close" v-if="stopCheck" />
+            <Icon type="md-close" v-if="stopCheck" style="cursor:default" />
             <Icon type="md-close" @click="deleteCity(item,i)" v-else />
           </li>
         </ul>
@@ -231,9 +231,9 @@ export default {
       },
       //确认
       confirmBtn(){
-          if(this.isCountry){ 
+          if(this.isCountry){
             this.currentDel.splice(0,1)
-            this.isCountry = false; 
+            this.isCountry = false;
           }
           this.selectCitys = this.currentDel;
           this.currentDel = [];
@@ -258,7 +258,7 @@ export default {
                 let proviceName = n.name.replace(reg,'');
                 return proviceName == privice.name;
             })
-            
+
             if(same > -1 && item[0].list[same].data.length>0){
               newSelect.forEach((val,x) =>{
                  if(privice.name == val.name){
@@ -440,4 +440,4 @@ export default {
       }
     }
   }
-</style>
+</style>

+ 21 - 0
src/helper.js

@@ -67,4 +67,25 @@ export const getUrlParam = function (name, type) {
         return unescape(r[2]);
       }
     return null;
+  }
+  export const debounce = (func, delay = 200, immediate) => {
+    let timer = null
+    return function () {
+      let context = this
+      let args = arguments
+      if (timer) clearTimeout(timer)
+      if (immediate) {
+        let doNow = !timer
+        timer = setTimeout(function () {
+          timer = null
+        }, delay)
+        if (doNow) {
+          func.apply(context, args)
+        }
+      } else {
+        timer = setTimeout(function () {
+          func.apply(context, args)
+        }, delay)
+      }
+    }
   }

+ 22 - 9
src/plugins/request.js

@@ -1,7 +1,7 @@
 import axios from 'axios'
 import qs from 'qs'
 
-import { actionUrl } from '../helper'
+import { actionUrl,serverUrl } from '../helper'
 import _ from 'lodash'
 
 export const request = function ({ type, data, dataType,contentType, url, success, error, complete }) {
@@ -15,7 +15,11 @@ export const request = function ({ type, data, dataType,contentType, url, succes
     if (_.indexOf(['POST', 'PUT', 'PATCH'], type) === -1) {
         config.params = data
     } else {
-        config.data = qs.stringify(data)
+        if(contentType == "application/json"){
+            config.data = JSON.stringify(data)
+        }else{
+            config.data = qs.stringify(data)
+        }   
     }
     axios(config).then((response) => {
         complete && complete()
@@ -27,7 +31,7 @@ export const request = function ({ type, data, dataType,contentType, url, succes
 }
 
 export const requestSuccessHandle = function (vue, response, tipSuccess, tipError, success, error, url) {
-    if (response.status === 'success') {
+    if (response.status === 'success' || response.error_code === 0) {
         if (tipSuccess) {
             vue.$Notice.success({
                 title: '操作提示',
@@ -115,22 +119,31 @@ class ActionRequest {
         return this
     }
 
-    get () {
-        return this.execute('get')
+    get (path) {
+        if (path && path == 'rewritePath') {
+            return this.execute('get',path)
+        }else{
+            return this.execute('get')
+        }   
     }
 
-    post () {
-        return this.execute('post')
+    post (path) {
+        if (path && path == 'rewritePath') {
+            return this.execute('post',path)
+        }else{
+            return this.execute('post')
+        } 
     }
 
-    execute (type) {
+    execute (type,path) {
+        let url_state = path || null
         this._type = type
         request({
             type: this._type,
             dataType: this._dataType,
             contentType: this._contentType,
             data: this._data,
-            url: actionUrl(this._action),
+            url: url_state == 'rewritePath'? serverUrl() + this._action : actionUrl(this._action),
             success: (response) => {
                 console.log(this._action)
                 requestSuccessHandle(

文件差異過大導致無法顯示
+ 483 - 379
src/views/order/components/bigOrder.vue


文件差異過大導致無法顯示
+ 751 - 678
src/views/order/components/bigOrderEdit.vue


+ 73 - 0
src/views/order/components/detailModel.vue

@@ -186,6 +186,23 @@
           <Button type="primary" size="large" @click="correctionSave()" :disabled="redCorrection == 4">提交</Button>
           <Button size="large" @click="correctionShow = false">取消</Button>
       </div>
+    </Modal>
+        <!-- 权限开通 -->
+    <Modal title="权限开通" v-model="permissionActivationShow" class-name="order-model permissionActivation-model" :mask-closable="false" @on-visible-change="permissionActivationVisible">
+      <Form ref="permissionActivation" :model="permissionActivation"  :label-width="120">
+        <FormItem label="开通权益手机号" style="width: 460px;" required>
+            <Input class="ipt-inpt" v-model="permissionActivation.phone" type="text"
+                            @on-keyup="keyHandler" :maxlength="11" placeholder="请输入手机号" ></Input>
+          </FormItem>
+          <FormItem label="开始日期" style="width: 460px;" required>
+            <date-sigle ref="sigleRef1" :dateType="'date'" :placeholderd="'请选择开始日期'"
+             @startDate="startDate_" :overTime="0"></date-sigle>
+          </FormItem>
+      </Form>
+      <div slot="footer">
+          <Button type="primary" size="large" @click="pa_Save" :disabled="pa_dis">确定</Button>
+          <Button size="large" @click="permissionActivationShow = false">取消</Button>
+      </div>
     </Modal>
   </div>
 </template>
@@ -193,6 +210,7 @@
 <script>
 import dateSigle from '@/components/dateSigle.vue'
 import bUpload from '@/components/uploadFile.vue'
+import { dateFormatter } from '@/assets/js/date'
 export default {
   props: {
     orderDetail: {},
@@ -233,6 +251,54 @@ export default {
     inptReg(val) {
       return val.match(/\d+(\.\d{0,2})?/) ? val.match(/\d+(\.\d{0,2})?/)[0] : ''
     },
+    keyHandler() {
+            this.permissionActivation.phone = this.permissionActivation.phone.replace(/[^\d]/g, '')
+        },
+    timeReg(val) {
+            return new Date(dateFormatter(val, 'yyyy-MM-dd') + ' 00:00:00').getTime() / 1000
+    },
+    startDate_(val) {
+      if (val) {
+        this.permissionActivation.startTime = this.timeReg(val)
+      } else {
+        this.permissionActivation.startTime = ''
+      }
+     },
+     permissionActivationVisible(val){
+      if(val){
+        this.permissionActivation.phone = this.orderDetail.user_phone || ''
+        this.permissionActivation.orderCode = this.orderDetail.order_code
+      }else{
+        this.permissionActivation.phone = ''
+        this.permissionActivation.startTime = ''
+        this.permissionActivation.orderCode = ''
+        this.$refs.sigleRef1.dataVals = ''
+      }
+     },
+     pa_Save(){
+      if (this.permissionActivation.phone == '') {
+          this.$Notice.warning({ title: '请输入手机号' })
+          return
+      }
+      if (this.permissionActivation.phone && !/^1[3456789]\d{9}$/.test(this.permissionActivation.phone)) {
+          this.$Notice.warning({ title: '手机号格式不正确' })
+          return
+      }
+      if (this.permissionActivation.startTime == '') {
+          this.$Notice.warning({ title: '请选择开始日期' })
+          return
+      }
+      this.pa_dis=true
+      let obj =this.permissionActivation
+      this.$request('/order/serviceOpen').data(obj).success(() => {
+        this.$parent.ordered()
+        this.permissionActivationShow = false
+        this.$Message.success({ content: '提交成功' })
+        this.pa_dis=false
+      }).error(() => {
+        this.pa_dis=false
+      }).post()
+     },
     visibleChange1(val) {
       if (val == false) {
           setTimeout(() => {
@@ -466,6 +532,8 @@ export default {
   },
   data() {
     return {
+      pa_dis:false,
+      permissionActivationShow:false,
       iShow: false,
       backShow: false,
       pShow: false,
@@ -490,6 +558,11 @@ export default {
         sum: '',
         shCode: ''
       },
+      permissionActivation: {
+        phone:'',
+        startTime:'',
+        orderCode:''
+      },
       models: {
         refundMoney: '',
         refundReason: '',

+ 257 - 91
src/views/order/components/details.vue

@@ -140,12 +140,12 @@
                     <span ><p>购买数量:</p><i>{{orDetails.buy_count || '1'}}人</i></span>
                     <span v-if="orderType == 8"><p>购买省份:</p>{{buyProvince?buyProvince:'--'}}</span>
                     <span v-if="orderType == 16"><p>购买区域:</p><i v-if="book">{{orderObjectd(book.area)?String(Object.keys(book.area)):'全国'}}</i></span>
-                    <span>
+                    <!-- <span>
                         <p>开始日期:</p>
                         <i class="i-inpt">{{orDetails?vip_starttime:'--'}}</i>
-                    </span>
+                    </span> -->
                     <span><p>计费模式:</p>{{orDetails?orDetails.billingMode==0?'免费':'收费':'--'}}</span>
-                    <span><p>订购区域:</p><i v-if="book">{{book?book.subscription_area?book.subscription_area:'--':'--'}}</i></span>
+                    <span><p>订购区域:</p><i style="max-width:70%;width:auto;" v-if="book">{{book?book.subscription_area?book.subscription_area:'--':'--'}}</i> <span style="color:#f00;" v-if="orDetails.vip_type == '2'">(此次增购{{book.subscription_area_count}}个省)</span></span>
                     <span v-if="orderType == 8"><p>订购行业:</p><i v-if="book">{{book?book.industry_str?book.industry_str:'--':'--'}}</i></span>
                     <span v-if="orderType == 8"><p>订阅周期:</p><i v-if="book">
                         {{book?book.cyclecount?book.cycleunit==1?book.cyclecount+'年':book.cycleunit==2?book.cyclecount+'个月':book.cycleunit==3?book.cyclecount+'天':book.cycleunit==4?book.cyclecount+'个季度':'--':'--':'--'}}
@@ -202,16 +202,23 @@
                     <span ><p>购买数量:</p><i>{{orDetails.buy_count ? orDetails.buy_count + '人' : '--' }}</i></span>
                     <span><p>计费模式:</p><i v-if="orDetails">{{orDetails?orDetails.billingMode==0?'免费':'收费':'--'}}</i></span>
                     <span><p>会员套餐:</p><i v-if="book">{{book?orderType == 10?'自定义':book.level:'--'}}</i></span>
-                    <span v-if="orderType == 7">
+                    <!-- <span v-if="orderType == 7">
                         <p>开始时间:</p>
                         <i class="i-inpt">{{orDetails?vip_starttime:'--'}}</i>
-                    </span>
-                    <span v-if="orderType == 7"><p>订阅周期:</p><i v-if="orDetails">{{orDetails?vip_starttime:''}}{{orDetails?vip_endtime:''}}</i></span>
-                    <span v-if="orderType !== 7"><p>有效日期:</p><i v-if="book">{{book?book.effective_date?book.effective_date:'--':'--'}}</i></span>
+                    </span> -->
+                    <!-- <span v-if="orderType == 7"><p>订阅周期:</p><i v-if="orDetails">{{orDetails?vip_starttime:''}}{{orDetails?vip_endtime:''}}</i></span>
+                    <span v-if="orderType !== 7"><p>有效日期:</p><i v-if="book">{{book?book.effective_date?book.effective_date:'--':'--'}}</i></span> -->
+                    <span v-if="orderType == 7 && book.cycle"><p>订阅周期:</p><i >{{book.cycle}}{{book.cycleType ===0 ? '个月':'天'}}</i></span>
+                    <span v-if="orderType !== 7"><p>有效日期:</p><i v-if="orDetails">{{orDetails?vip_starttime:''}}{{orDetails?vip_endtime:''}}</i></span>
+                    <span v-if="orderType == 9"><p>关联订单:</p><i style="cursor:pointer" @click="contactOrderCode_click(book.contactOrderId)" v-if="book">{{book.contactOrderCode}}</i></span>
                     <span v-if="showFiled"><p>付费子账号:</p><i v-if="book">{{book.pay_sub_num||book.pay_sub_num==0?book.pay_sub_num+'个':'--'}}</i></span>
                     <span v-if="showFiled"><p>免费子账号:</p><i v-if="book">{{book.free_sub_num||book.free_sub_num==0?book.free_sub_num+'个':'--'}}</i></span>
                     <span v-if="orderType == 7 && book.level == '自定义'"><p>服务列表:</p>
-                        <ul v-if="serverData.length !== 0">
+                        <ul v-if="newSerName && oldSerName">
+                          <li>1.补充服务:{{newSerName}}</li>
+                          <li>2.原已购服务:{{oldSerName}}</li>
+                        </ul>
+                        <ul v-if="serverData.length !== 0 && !(newSerName && oldSerName)">
                             <li v-for="(item,index) in serverData" :key="index">{{item}}</li>
                         </ul>
                     </span>
@@ -317,6 +324,84 @@
             </div>
             <Divider />
         </div>
+        <!-- 合同信息 -->
+        <div class="infor-card" v-if="book.source == 'qmx'">
+            <div class="cont">
+                <div class="tit">合同信息</div>
+                <div class="classfity">
+                    <!-- 原订单金额 -->
+                    <span><p>标准售价:</p> {{orDetails.order_money?localed(orDetails.order_money):'--'}}</span>
+                    <!-- 应付金额: -->
+                    <span><p>合同金额:</p> {{orDetails?localed(orDetails.pay_money/100):'--'}}</span>
+                    <span><p>折扣率:</p> {{ orDetails.discountRate || '--'}}</span>
+                    <!-- <div v-if="orderType == 7||orderType == 9||orderType == 10">
+                        <span><p>大会员应付金额:</p> {{book.bigPayMoney?localed(book.bigPayMoney/100):'--'}}</span>
+                        <span><p>子账号应付金额:</p> {{book.subPayMoney?localed(book.subPayMoney/100):'--'}}</span>
+                        <span><p>补充包应付金额:</p> {{book.supplyPayMoney?localed(book.supplyPayMoney/100):'--'}}</span>
+                    </div> -->
+                    <span><p>佣金金额:</p> {{orDetails?localed(orDetails.commission/100):'--'}}</span>
+                    <span><p>手续费:</p> {{orDetails?localed(orDetails.procedures_money/100):'--'}}</span>
+                    <span><p>应收金额:</p> {{trueMoney || '--'}}</span>
+                    <!-- <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>
+                     <template v-if="contractData&&contractData.contract_status==1">
+                        <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>
+                     </template>
+                     <template v-else>
+                        <span><p>电子协议类型:</p>--</span>
+                        <span><p>协议甲方类型:</p>--</span>
+                        <span><p>协议甲方:</p>--</span>
+                        <span><p>协议甲方联系人:</p>--</span>
+                        <span><p>协议甲方联系方式:</p>--</span>
+                        <span><p>协议甲方联系地址:</p>--</span>
+                        <span><p>协议乙方联系人:</p>--</span>
+                        <span><p>协议备注:</p>--</span>
+
+                        <span><p>协议归档状态:</p>--</span>
+                        <span><p>归档时间:</p>--</span>
+                        <span><p>归档份数:</p>--</span>
+                        <span>
+                          <p>归档协议:</p>
+                        <span >--</span>
+                        </span>
+
+                     </template>
+
+                </div>
+            </div>
+            <Divider />
+        </div>
+                <!-- 订单备注 -->
+      <div class="infor-card" v-if="book.source == 'qmx'">
+        <div class="cont">
+          <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>
+            </span>
+          </div>
+        </div>
+        <Divider />
+      </div>
         <!-- 支付信息 -->
         <div class="infor-card" v-if="book.source !== 'qmx'">
             <div class="cont">
@@ -380,6 +465,38 @@
             <Divider />
         </div>
         <!-- 回款信息 -->
+        <div class="infor-card">
+            <div class="cont">
+                <div class="tit">回款计划</div>
+                <div class="classfity" v-if="book">
+                    <div><span><p>回款次数:</p>{{book.paybackNum || '--'}}</span></div>
+                    <div class="listbox" style="padding-left:65px" v-if="book.paybackNum>1">
+                        <Table border :columns="paybackTable" :data="paybackTableData">
+                            <template slot-scope="{ row }" slot="code">
+                                <strong>{{ row.code }}</strong>
+                            </template>
+                            <template slot-scope="{ row }" slot="time">
+                                <strong>{{row.time || '-'}}</strong>
+                            </template>
+                            <template slot-scope="{ row }" slot="money">
+                                <strong >{{row.money || '-'}}</strong>
+                            </template>
+                      </Table>
+                    </div>
+                    <span v-else>
+                        <p>回款计划:</p>
+                        <i v-if="book.paybackExpectDate">
+                          <i v-if="contractData && contractData.contract_status==1">自协议签订之日起</i>
+                          <i v-else>自订单创建之日起</i>
+                          <i>{{book.paybackWorkDayNum}}个工作日回款,预计回款时间:<i style="color: #36a3f7">{{ book.paybackExpectDate || '-'}}</i></i>
+                        </i>
+                        <span v-else>--</span>
+                    </span>
+                </div>
+            </div>
+            <Divider/>
+        </div>
+        <!-- 回款信息 -->
         <div class="infor-card" v-if="book.source == 'qmx' || orDetails.pay_way == '对公转账' || orDetails.order_channel == 'd03' || orDetails.return_status !== 1">
             <div class="cont">
                 <div class="tit">回款信息</div>
@@ -460,71 +577,6 @@
             </div>
             <Divider />
         </div>
-        <!-- 合同信息 -->
-        <div class="infor-card" v-if="book.source == 'qmx'">
-            <div class="cont">
-                <div class="tit">合同信息</div>
-                <div class="classfity">
-                    <!-- 原订单金额 -->
-                    <span><p>标准售价:</p> {{orDetails.order_money?localed(orDetails.order_money):'--'}}</span> 
-                    <!-- 应付金额: -->
-                    <span><p>合同金额:</p> {{orDetails?localed(orDetails.pay_money/100):'--'}}</span>
-                    <span><p>折扣率:</p> {{ orDetails.discountRate || '--'}}</span>
-                    <!-- <div v-if="orderType == 7||orderType == 9||orderType == 10">
-                        <span><p>大会员应付金额:</p> {{book.bigPayMoney?localed(book.bigPayMoney/100):'--'}}</span>
-                        <span><p>子账号应付金额:</p> {{book.subPayMoney?localed(book.subPayMoney/100):'--'}}</span>
-                        <span><p>补充包应付金额:</p> {{book.supplyPayMoney?localed(book.supplyPayMoney/100):'--'}}</span>
-                    </div> -->
-                    <span><p>佣金金额:</p> {{orDetails?localed(orDetails.commission/100):'--'}}</span>
-                    <span><p>手续费:</p> {{orDetails?localed(orDetails.procedures_money/100):'--'}}</span>
-                    <span><p>应收金额:</p> {{trueMoney || '--'}}</span>
-                    <!-- <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>
-                     <template v-if="contractData&&contractData.contract_status==1">
-                        <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>
-                     </template>
-                     <template v-else>
-                        <span><p>电子协议类型:</p>--</span>
-                        <span><p>协议甲方类型:</p>--</span>
-                        <span><p>协议甲方:</p>--</span>
-                        <span><p>协议甲方联系人:</p>--</span>
-                        <span><p>协议甲方联系方式:</p>--</span>
-                        <span><p>协议甲方联系地址:</p>--</span>
-                        <span><p>协议乙方联系人:</p>--</span>
-                        <span><p>协议备注:</p>--</span>
-
-                        <span><p>协议归档状态:</p>--</span>
-                        <span><p>归档时间:</p>--</span>
-                        <span><p>归档份数:</p>--</span>
-                        <span>
-                          <p>归档协议:</p>
-                        <span >--</span>
-                        </span>
-
-                     </template>
-
-                </div>
-            </div>
-            <Divider />
-        </div>
         <!-- 红冲记录 -->
         <div class="infor-card" v-if="book.source == 'qmx' || orDetails.pay_way == '对公转账' || orDetails.order_channel == 'd03' || orDetails.return_status !== 1">
             <div class="cont">
@@ -537,7 +589,7 @@
                         <span v-if="item.redType.indexOf('签约主体')>-1"><p>红冲前签约主体:</p>{{item.signingSubject}}</span>
                         <!-- <span v-if="item.redType.indexOf('金额')>-1 && orDetails.product_type === '大会员'"><p>大会员应付金额变动:</p>{{item.payMoney?item.payMoney>0?'+'+item.payMoney/100:item.payMoney/100:'--'}}</span> -->
                         <!-- <span v-if="item.redType.indexOf('金额')>-1 && orDetails.product_type === '大会员'"><p>子账号应付金额变动:</p>{{item.bigSubMoney?item.bigSubMoney>0?'+'+item.bigSubMoney/100:item.bigSubMoney/100:'--'}}</span> -->
-                        <!-- <span v-if="item.redType.indexOf('金额')>-1 && orDetails.product_type === '大会员'"><p>补充包应付金额变动:</p>{{item.supplyMoney?item.supplyMoney>0?'+'+item.supplyMoney/100:item.supplyMoney/100:'--'}}</span> --> 
+                        <!-- <span v-if="item.redType.indexOf('金额')>-1 && orDetails.product_type === '大会员'"><p>补充包应付金额变动:</p>{{item.supplyMoney?item.supplyMoney>0?'+'+item.supplyMoney/100:item.supplyMoney/100:'--'}}</span> -->
                         <span v-if="item.redType.indexOf('金额')>-1 && orDetails.product_type === '大会员'"><p>合同金额变动</p>{{priceProcessing(item.payMoney,item.bigSubMoney,item.supplyMoney)}}</span>
                         <span v-if="item.redType.indexOf('金额')>-1 && orDetails.isNewOrder!='1' && orDetails.product_type != '大会员'"><p>订单金额变动:</p>{{item.orderMoney?item.orderMoney>0?'+'+item.orderMoney/100:item.orderMoney/100:'--'}}</span>
                         <span v-if="item.redType.indexOf('金额')>-1 && orDetails.product_type != '大会员'"><p>合同金额变动:</p>{{item.payMoney?item.payMoney>0?'+'+item.payMoney/100:item.payMoney/100:'--'}}</span>
@@ -551,19 +603,24 @@
             </div>
             <Divider />
         </div>
-        <!-- 订单备注 -->
-        <div class="infor-card" v-if="book.source == 'qmx'">
-            <div class="cont">
-                <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>
-                    </span>
+        <!--      盖章记录-->
+        <div class="infor-card sale-record">
+          <div class="cont">
+            <div class="tit">盖章记录</div>
+            <div class="classfity">
+              <i v-if="!orders.sealArr || (orders.sealArr && orders.sealArr.length === 0)" style="color:#888">暂无盖章记录</i>
+              <template v-if="orders.sealArr && orders.sealArr.length > 0">
+                <div class="seal-item" v-for="item in orders.sealArr" :key="item.id" >
+                  <span class="s-row"><p class="s-label">盖章时间:</p>{{ item.stamp_time ? item.stamp_time.split(' ')[0] : '-'}} <span v-if="showSealBtn" class="color4 delete-text"  @click="deleteSealItem(item)">删除</span></span>
+                  <span class="s-row"><p class="s-label">申请人:</p>{{item.applicant_name ? item.applicant_name:  '--'}}</span>
+                  <span class="s-row"><p class="s-label">操作人:</p>{{item.salesperson_name ? item.salesperson_name : '--'}}</span>
+                  <span class="s-row"><p class="s-label">操作时间:</p>{{item.create_time ? item.create_time : '--'}}</span>
                 </div>
+              </template>
             </div>
-            <Divider />
+          </div>
         </div>
+
         <div class="bot-btn">
             <Button
                 class="piao-btn"
@@ -586,10 +643,9 @@
                 type="success"
                 size="large"
                 disabled
-                v-if="returnMyReceivable &&(returnCashStatus || (orDetails.order_status == -2 || orDetails.order_status == '已取消'))"
+                v-if="returnMyReceivable &&(returnCashStatus || (orDetails.order_status == -2 || orDetails.order_status == '已取消')) || orDetails.audit_status != 3"
             >新增回款信息</Button>
-            <Button v-else-if="returnMyReceivable" class="piao-btn" type="success" size="large" @click="relation" >新增回款信息</Button>
-
+            <Button v-else-if="returnMyReceivable && orDetails.audit_status == 3" class="piao-btn" type="success" size="large" @click="relation" >新增回款信息</Button>
 
             <Button
                 class="ping-btn"
@@ -618,11 +674,20 @@
                 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
+            v-if="showPermissionActivation"
+                class="piao-btn"
+                style="margin-left:20px"
+                type="success"
+                size="large"
+                @click="permissionActivation"
+            >权限开通</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>
             <Button class="tui-btn" size="small" type="error" disabled v-else-if="returnMyReceivable" >退款</Button>
             <Button class="shen-btn" size="small" type="error" :disabled="!returnMyReceivable" @click="correction" v-if="returnMyReceivable && orDetails.billingMode === 1 && this.book.source === 'qmx'" >红冲</Button>
+            <Button  class="seal-btn" size="small" type="primary" @click="sealBtnHandle" v-if="showSealBtn">盖章</Button>
         </div>
         <!-- 线下开发票、新增回款信息、审核、退款弹框 -->
         <d-model
@@ -651,6 +716,8 @@
         <online-order-edit ref="onlineOrderEdit" returnMyReceivable/>
         <otherOrderEdit ref="otherOrderEdit" returnMyReceivable/>
         <bigOrderEdit ref="bigOrderEdit" returnMyReceivable/>
+        <!-- 盖章记录弹窗-->
+        <sealDialog ref="sealDialogRef"  />
     </div>
 </template>
 
@@ -664,6 +731,7 @@ import onlineOrderEdit from "./onlineOrderEdit.vue"
 import otherOrderEdit from "./otherOrderEdit.vue"
 import bigOrderEdit from "./bigOrderEdit.vue"
 import reviewRecord from './reviewRecord.vue'
+import sealDialog from './sealDialog'
 import { dateFormatter, addDate } from '@/assets/js/date.js'
 import { Input, Button } from 'element-ui'
 export default {
@@ -681,7 +749,8 @@ export default {
         onlineOrderEdit,
         otherOrderEdit,
         bigOrderEdit,
-        reviewRecord
+        reviewRecord,
+        sealDialog
     },
     data () {
         return {
@@ -697,6 +766,21 @@ export default {
                     width: 250,
                 }
             ],
+            paybackTable:[               
+                 {
+                    title: '序号',
+                    slot: 'code'
+                },
+                {
+                    title: '预计回款时间',
+                    slot: 'time'
+                },
+                {
+                    title: '预计回款金额(元)',
+                    slot: 'money'
+                }
+            ],
+            paybackTableData:[],
             saleTableData: [],
             saleReadon: true,
             phoneReadon: true,
@@ -732,10 +816,21 @@ export default {
             },
             previousPage:'',
             showDialog: false,
-            isShowCustom: false
+            isShowCustom: false,
+            newSerName:'',
+            oldSerName:'',
+            // 有盖章操作权限的用户
+            stampedInterest: []
         }
     },
     computed: {
+        showPermissionActivation () {// 权限开通
+            let newVip = (this.orderType == 8 || this.orderType == 16) && !this.orDetails.vip_type //超级订阅新购
+            let newMember = (this.orderType == 7) && this.book.createType == 1 //大会员新购
+            console.log(this.orDetails.vip_starttime)
+           return this.orDetails.return_status == '1' && this.orDetails.isServiceOpen === 0 && (newVip || newMember) && new Date(this.orDetails.vip_starttime).getTime() > new Date().getTime()
+
+        },
         // 是否显示付费子账号,免费子账号字段
         showFiled () {
           if (this.orDetails.isNewOrder!='1') {
@@ -858,12 +953,30 @@ export default {
                     }
                 }
             }
-        }
+        },
+      username () {
+        return this.$store.getters.getAdminUser?.username
+      },
+      // 是否展示盖章按钮
+      showSealBtn () {
+        // 全部部订单-订单详情页,仅当“订单审核状态”为“通过”且订单状态不是“已取消”,才展示“盖章”按钮(行政有权限,冯慧洋),否则不展示
+        return this.stampedInterest.indexOf(this.username) > -1 && this.returnMyReceivable && this.orDetails.audit_status === 3 && Number(this.orDetails.orderStatus) !== -2
+      }
     },
     created () {
         this.ordered()
     },
     methods: {
+        contactOrderCode_click(code){
+            const news = this.$router.resolve({
+                path: '/order/orderList/orderDetail',
+                query: { id: code, proType: '大会员' }
+            })
+            window.open(news.href, '_blank')
+        },
+        permissionActivation(){
+            this.$refs.backRef.permissionActivationShow = true
+         },
         // 文件下载,跨域无效
         downloadFile (url, filename) {
             const link = document.createElement('a')
@@ -1056,6 +1169,18 @@ export default {
                 this.returnRes = r.data.returnRes
                 this.returnInfo = r.data.returnInfo?r.data.returnInfo[0]:[]
                 this.book = r.data.filterData
+                // 回款计划列表
+                this.paybackTableData = this.book.paybackList ? JSON.parse(this.book.paybackList) : []
+                // 有盖章按钮操作权限用户
+                this.stampedInterest = r.data.stampedInterest || []
+
+                if(this.book && this.orDetails.product_type == '大会员' && this.book.createType == '2' && this.book.oldSerName && this.book.serversName){
+                    let allServeName = this.book.serversName.split(",")
+                    let oldSerName = this.book.oldSerName.split("、")
+                    let newSerName = allServeName.filter(item => !oldSerName.includes(item))
+                    this.newSerName = newSerName.join("、")
+                    this.oldSerName = oldSerName.join("、")
+                }
                 this.$refs.othersReviewRecord.recordList = r.data.audit
                 if (r && r.data && r.data.res && r.data.res.salesperson && r.data.res.saleMoney) {
                     this.saleTableData = JSON.parse(r.data.res.saleMoney).data
@@ -1158,7 +1283,7 @@ export default {
                 this.orders.res.payTypes = 'transferAccounts'
             }
             if(source=='qmx'){ //线下
-                if(product_type.indexOf('大会员')!=-1){
+                if(product_type && product_type.indexOf('大会员')!=-1){
                     this.$refs.bigOrderEdit.show(this.orders)
                 }else{
                     this.$refs.otherOrderEdit.show(this.orders)
@@ -1194,6 +1319,25 @@ export default {
             }else{
                 return '--'
             }
+        },
+        // 盖章
+        sealBtnHandle () {
+          this.$refs.sealDialogRef.show(this.orDetails)
+        },
+       // 删除盖章记录
+        deleteSealItem (item) {
+          this.$Modal.confirm({
+            title: '确认要删除这条盖章记录吗?',
+            onOk: () => {
+              this.$request('/order/orderSeal').data ({ id : item.id, regType: 'delete'}).success((res) => {
+                if (res.data?.code === 0) {
+                  this.$Message.success({content: '删除记录成功'})
+                  this.ordered()
+                }
+              }).error (() => {
+              }).post()
+            }
+          })
         }
     },
     filters: {
@@ -1493,5 +1637,27 @@ export default {
             margin: 0 20px;
         }
     }
+  .sale-record{
+    .seal-item {
+      background: #f2f2f2;
+      font-size:14px;
+      padding:5px;
+      .s-label {
+        min-width:86px !important;
+      }
+      .s-row {
+        line-height:24px;
+        .delete-text {
+          width:60px;
+          margin-left:15px;
+          cursor: pointer;
+        }
+      }
+    }
+    .seal-item:not(:first-child) {
+      margin-top:10px;
+    }
+
+  }
 }
 </style>

+ 391 - 67
src/views/order/components/otherOrder.vue

@@ -58,15 +58,18 @@
             <Option v-for="item in adFrom" :value="item.v" :key="item.v">{{ item.n }}</Option>
           </Select>
         </FormItem>
+        <div class="flex-endbox">
           <FormItem label="字段类型" v-if="others.productType == '2'||others.productType == '4'">
             <RadioGroup v-model="others.dataType" >
               <Radio v-for="item in fieldStas" :label="item.v" :key="item.v">{{ item.n }}</Radio>
             </RadioGroup>
           </FormItem>
           <FormItem label="服务起止时间" v-if="others.productType !== '5'">
-            <f-date ref="dateRef" :placeholder1="'请选择服务开始时间'" :placeholder2="'请选择服务结束时间'" @startsData="startsData"
-                  @endsData="endsData"></f-date>
+            <f-date class="service-date-picker" ref="dateRef" :placeholder1="'请选择开始时间'" :placeholder2="'请选择结束时间'" @startsData="startsData"
+                    @endsData="endsData"></f-date>
           </FormItem>
+        </div>
+
         <FormItem label="付费类型" required v-show="others.productType == '5'">
           <RadioGroup v-model="others.vipType" @on-change="payChange">
             <Radio label="0" :disabled="gouDis || payDis">购买</Radio>
@@ -79,34 +82,43 @@
         </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">
+          <div v-show="others.vipType=='1'" style="color:#ed4014;font-size:13px;line-height:20px">
             原套餐购买省份:{{ areaNums.areaCount == 0 ? '全国' : areaNums.areaCount + '个' }}
-            <span v-show="others.vipType == '2'">,注意:订阅的区域会调整为此次升级选择的省份,请提前与用户确认升级省份</span>
+          </div>
+          <div v-show="others.vipType=='2'" style="color:#ed4014;font-size:13px;line-height:20px">
+            注:服务到期时间:{{ serviceEndTime }},原套餐购买省份:{{ areaNums.areaCount == 0 ? '全国' : areaNums.areaCount + '个' }},
+            {{ '此次增购' + addAreaCount + '个' }}
+            <span>,注意:订阅的区域会调整为此次升级选择的省份,请提前与用户确认升级省份</span>
           </div>
         </FormItem>
         <div class="two-val" style="display:flex" v-show="others.productType == '5' && others.vipType!=='2'">
           <FormItem label="有效周期" required style="display:flex">
             <Input
+                style="width:130px;"
                 v-model="others.cycleCount"
                 type="text"
                 @on-keyup="others.cycleCount=others.cycleCount.replace(/[^\d]+/g,'')"
                 :maxlength="12"
                 placeholder="请输入有效周期"
                 :disabled="others.vipType=='2'"
-                style="width:476px"
             ></Input>
           </FormItem>
-          <FormItem required style="margin-left:10px">
+          <FormItem required style="margin-left:10px;width:110px;">
             <Select v-model="others.cycleUnit" placeholder="请选择单位" :disabled="others.vipType=='2'" style="width:110px;">
               <Option v-for="item in unitOptions" :value="item.v" :key="item.v">{{ item.n }}</Option>
             </Select>
           </FormItem>
-        </div>
+          <FormItem style="margin-left:10px;">
+           <Checkbox v-if="!showOrderStatus && others.vipType=='0'" v-model="others.paybackOpenServer">全额回款当日自动开通</Checkbox>
+          </FormItem>
+          <span class="cycle-tip" v-if="showCycleTip">全额回款后将自动续费开通权益,如若回款时间晚于原服务到期时间,则开始日期为回款日期。</span>
+
           <FormItem label="开始日期" :required="showOrderStatus" v-show="others.productType == '5' && showOrderStatus && !(others.vipType!=='0'||(!showOrderStatus&&others.vipType === '0'))">
             <date-sigle
+                style="width: 120px;"
                 ref="sigleRef1"
                 :dateType="'date'"
-                :placeholderd="'请选择开始日期'"
+                :placeholderd="'请选择'"
                 @startDate="startDate1"
                 :disabledDateCallback="disabledDateForVIPCallback"
                 class="no-pass"
@@ -117,8 +129,13 @@
             <Checkbox v-model="noPass" @on-change="noTchange"
                       :disabled="(others.vipType!=='0')||(!showOrderStatus&&others.vipType === '0')">暂不开通
             </Checkbox>
+            <Checkbox  v-model="others.paybackOpenServer" @on-change="noTchange"
+                       :disabled="(showOrderStatus && !noPass) || (others.vipType!=='0')||(!showOrderStatus&&others.vipType === '0')">全额回款当日自动开通
+            </Checkbox>
           </FormItem>
 
+        </div>
+
           <!-- <FormItem label="计费模式" required>
             <Select v-model="others.chargeMode" placeholder="请选择计费模式" @on-change="jiChange">
               <Option v-for="item in chargeStatus" :value="item.v" :key="item.v">{{ item.n }}</Option>
@@ -197,7 +214,7 @@
         </FormItem>
         <div class="flex-endbox">
           <FormItem label="协议状态" required>
-          <RadioGroup v-model="others.contractStatus" >
+          <RadioGroup v-model="others.contractStatus" @on-change="contractStatusChange">
             <Radio v-for="item in agreeStatus" :label="item.v" :key="item.v">{{ item.n }}</Radio>
           </RadioGroup>
         </FormItem>
@@ -215,8 +232,40 @@
           <Input v-model="others.contractCode" type="text" placeholder="请输入协议编号"></Input>
         </FormItem>
         </div>
-    
-          <OnlineContractForm
+        <div>
+          <div class="flex-endbox">
+            <FormItem label="协议归档状态" v-if="others.contractStatus == '1'">
+              <RadioGroup v-model="others.contract_archive_status" >
+                <Radio label="0">未归档</Radio>
+                <Radio label="1">已归档</Radio>
+              </RadioGroup>
+            </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>
+          </div>
+          <div class="flex-endbox">
+            <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" v-show="others.contract_archive_status == '1'">
+              <b-upload
+                  ref="uploadRef"
+                  @fileData="contractFile"
+                  :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>
+          </div>
+        </div>
+        <OnlineContractForm
             ref="onlineContractFormRef"
             v-if="showOnlineContractForm"
             :showMore="showXieYi && showOnlineContractForm"
@@ -233,49 +282,54 @@
             :e_contract_userB_contacts_name.sync="others.e_contract_userB_contacts_name"
             :e_contract_remark.sync="others.e_contract_remark"
           />
-          <div v-show="!showOnlineContractForm || showXieYi">
-          <div class="flex-endbox">
-            <FormItem label="协议归档状态" v-if="others.contractStatus == '1'">
-            <RadioGroup v-model="others.contract_archive_status" >
-              <Radio label="0">未归档</Radio>
-              <Radio label="1">已归档</Radio>
-            </RadioGroup>
-          </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>
-          </div>
-          <div class="flex-endbox">
-            <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" v-show="others.contract_archive_status == '1'">
-            <b-upload
-                ref="uploadRef"
-                @fileData="contractFile"
-                :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>
-          </div>
-        </div>
+
         <div style="display: flex;justify-content: center;" v-show="!showXieYi && showOnlineContractForm">
           <div @click="showXieYi = !showXieYi" style="color: #36a3f7;cursor: pointer; font-size: 14px;">
             <span>更多信息</span>
             <i class="el-icon-arrow-down"></i>
           </div>
         </div>
-        <FormItem label="业绩归属" class="formTitle">
+
+        <!--回款计划start-->
+         <FormItem label="回款计划" class="formTitle"></FormItem>
+         <FormItem  label="回款次数"  required>
+           <Input v-model.trim="others.paybackNum" type="text" @on-keyup="formatWorkDayNum('paybackNum')"
+                  style="width: 80px;margin-right:5px;"></Input>次
+         </FormItem>
+          <!-- 回款列表 -->
+         <FormItem label="" v-show="others.paybackNum > 1">
+          <Table border :columns="paybackTable" :data="paybackTableData">
+            <template slot-scope="{ row }" slot="code">
+              <strong>{{ row.code }}</strong>
+            </template>
+            <template slot-scope="{ row, index }" slot="time">
+              <strong v-if="row.code == '合计'">-</strong>
+              <date-sigle :ref="'paybackTime'+index" :dateType="'date'" :dataV="paybackTableData[index].time"
+                          :placeholderd="'请选择'" @startDate="paybackTableChange(row,index,'time',$event)" :overTime="0" v-else></date-sigle>
+            </template>
+            <template slot-scope="{ row, index }" slot="money">
+              <strong v-if="row.code == '合计'">{{ others.contractMoney || '-' }}</strong>
+              <Input @mousewheel.native.prevent @DOMMouseScroll.native.prevent
+                     v-model="paybackTableData[index].money" @on-keyup="paybackTableChange(row,index,'money')"
+                     type="number" placeholder="请输入" :disabled="index + 1  == others.paybackNum" v-else></Input>
+            </template>
+          </Table>
+         </FormItem>
+        <FormItem style="padding-left:30px;" label=" " :label-width="0" required v-show="others.paybackNum==1">
+          <div>
+            <span>{{others.contractStatus == '1' ? '自协议签订之日起': '自订单创建之日起'}}</span>
+            <Input v-model="others.paybackWorkDayNum" type="text" @on-keyup="formatWorkDayNum('paybackWorkDayNum')"
+                   style="width: 80px;margin-left:10px;margin-right: 10px;"></Input>
+            个工作日回款,预计回款时间:<span v-if="others.paybackExpectDate "  style="color: #36a3f7">{{ others.paybackExpectDate }}</span><span v-else>-</span>
+          </div>
         </FormItem>
+        <!--回款计划end-->
+
+        <FormItem label="业绩归属" class="formTitle"></FormItem>
         <div class="flex-endbox">
           <FormItem label="业绩归属部门" required>
           <!-- <Cascader v-model="others.saleCodeModel" :data="saleDep" trigger="hover" change-on-select @on-visible-change="saleDepClick" @on-change="saleDepChange"></Cascader> -->
-          <cascaderMulti class="truecascader" v-model="others.saleCodeModel" :data="saleDep" multiple @on-change="saleDepChange"></cascaderMulti>
+          <cascaderMulti v-if="saleDep && saleDep.length > 0"  class="truecascader" v-model="others.saleCodeModel" :data="saleDep" multiple @on-change="saleDepChange"></cascaderMulti>
         </FormItem>
         <FormItem label="业绩统计时间">
           <date-sigle ref="sigleRef4" :dateType="'date'" :dataV="others.sale_time" :placeholderd="'请选择业绩统计时间'"
@@ -313,7 +367,7 @@
                       @levelChange="channelChange" v-if="oShow"></v-cascader>
         </FormItem>
         </div>
-        <div v-show="showOrderOther">
+        <div>
           <FormItem label="订单备注">
             <Input v-model="others.remark" type="text" :maxlength="40" placeholder="请输入订单备注"></Input>
           </FormItem>
@@ -324,12 +378,6 @@
             </Select>
           </FormItem>
         </div>
-        <div style="display: flex;justify-content: center;" v-show="!showOrderOther">
-          <div @click="showOrderOther = !showOrderOther" style="color: #36a3f7;cursor: pointer; font-size: 14px;">
-            <span>更多信息</span>
-            <i class="el-icon-arrow-down"></i>
-          </div>
-        </div>
       </Form>
       <div slot="footer">
         <Button type="primary" size="large" @click="otherConfirm({ save:'1' })" :disabled="isDisable">提交</Button>
@@ -351,6 +399,7 @@ import saleSelect from './salesSelect.vue'
 import OnlineContractForm from '@/components/OnlineContractForm'
 import { dateFormatter } from '@/assets/js/date';
 import { Icon } from 'element-ui'
+import { debounce } from '@/helper.js'
 
 export default {
   name: 'CreateOtherOrderModal',
@@ -384,6 +433,11 @@ export default {
     },
     addEventListenerVip () {
       return this.others.productType + this.others.cycleCount + this.others.cycleUnit + this.others.vipStartTime + this.others.buySubject + this.others.buyCount + this.others.area + this.areaNums
+    },
+    // 展示有效周期提示,展示条件:【产品类型为超级订阅,付费类型为续费】、【产品类型为大会员,购买主体为个人,延长服务】
+    showCycleTip () {
+      const isVipAndRenew = this.others.productType === '5' && this.others.vipType === '1'
+      return isVipAndRenew
     }
   },
   watch: {
@@ -397,21 +451,32 @@ export default {
         } else {
           // 大于等于16个省相当于全国,areaCount = 0
           if(area.split(',').length >= 16) {
-            areaCount = 0
+            if(productType == '5' && vipType === '2') {
+              areaCount = area.split(',').length
+            } else {
+              areaCount = 0
+            }
           } else {
             areaCount = area.split(',').length
           }
         }
+        // 本次新增的省份个数(全国即表示16个省份)
+        if(productType == '5' && vipType === '2') {
+          // 本次新增的省份(全国即表示16个省份)
+          this.addAreaCount = areaCount === 0 ? (16 - this.areaNums.areaCount)  : (areaCount - this.areaNums.areaCount)
+        }
       } else {
         if (this.areaNums.areaCount) {
           areaCount = this.areaNums.areaCount
         } else {
           areaCount = 0
         }
+        this.addAreaCount = this.areaNums.areaCount * -1
       }
       if(buySubject == '1') {
         buyCount = '1'
       }
+
       if (buySubject && buyCount && vipType && productType == '5') {
         const url = '/order/orderPriceCount'
         this.$request(url).data({
@@ -426,7 +491,6 @@ export default {
           originalAreaCount: this.areaNums.areaCount,
           phone: vipType == '2' ? phone : ''
         }).success((resdata) => {
-          console.log(resdata, 'resdata')
           if(resdata.status === 'success') {
             _this.others.orderMoney = resdata.data.price
           }
@@ -441,6 +505,9 @@ export default {
         },
     inited() {// 初始化
       // this.$refs['others'].resetFields()
+      // 回款计划列表数据初始化
+      this.paybackTableData = []
+      this.saleDep = []
       this.$refs.uploadRef.uploadShow = false
       this.$refs.uploadRef.payHtml = ''
       this.noPass = false
@@ -449,7 +516,6 @@ export default {
       this.stopCheck = false
       this.gouDis = false
       this.showXieYi = false
-      this.showOrderOther = false
       this.$refs.cityArea.selectCitys = []
       this.others.area = ''
       this.others.commission = '0'
@@ -506,6 +572,12 @@ export default {
         } else if (key.startsWith('e_contract_')) {
           // 默认重置
           this.others[key] = this.$options.data().others[key]
+        } else if (key === 'paybackOpenServer') {
+          this.others.paybackOpenServer = false
+        } else if (key === 'contractTime') {
+          this.others.contractTime = dateFormatter(new Date(), 'yyyy-MM-dd') + ' 00:00:00'
+        } else if (key==='paybackNum') {
+          this.others.paybackNum = 1
         } else if (key!=='salesPerson'){
           this.others[key] = ''
         }
@@ -516,6 +588,8 @@ export default {
         this.others.orderMoney = this.conHandler(this.others.orderMoney)
       } else if (val === '2') {
         this.others.contractMoney = this.conHandler(this.others.contractMoney)
+        // 多次回款回款计划列表数据
+        this.formatWorkDayNum('contractMoney')
       } else if (val === '3') {
         this.others.commission = this.conHandler(this.others.commission)
       } else if (val === '4') {
@@ -546,6 +620,7 @@ export default {
         })
     },
     saleDepClick () {
+      const _this = this
         let url = '/order/getSalesChannelItem'
         this.$request(url).data({
             name: this.reqType
@@ -553,6 +628,18 @@ export default {
             if (res.data.dep) {
                 this.saleDep = res.data.dep
             }
+          if(res.data.displayMap){
+            if( res.data.displayMap.distribution_channel){
+              this.others.salesChannel = res.data.displayMap.distribution_channel
+            }
+            // 初始化回显业绩归属部门
+            if(res.data.displayMap.saleDep){
+              _this.others.saleCodeModel = res.data.displayMap.saleDep
+            } else {
+              // 业绩归属部门为“销售一部/电销组”或“销售三部”
+              _this.others.saleCodeModel = ['050000']
+            }
+          }
         }).post()
     },
     saleDepChange (val) {
@@ -562,10 +649,10 @@ export default {
         if(val.indexOf('010100')>-1 || val.indexOf('010101')>-1 || val.indexOf('010102')>-1 || val.indexOf('010103')>-1 || val.indexOf('010104')>-1 || val.indexOf('050000')>-1){
             this.$refs.casRef.values = ['x02', 'x020'] //业绩归属部门为“销售一部/电销组”或“销售三部”,销售渠道默认为“线下直销/电销”
             this.others.salesChannel = 'x020'
-            this.$refs.casRef.getDictItem(() => {
-              this.$refs.casRef.setDate(this.others.salesChannel)
-            })
         }
+        this.$refs.casRef.getDictItem(() => {
+          this.$refs.casRef.setDate(this.others.salesChannel)
+        })
       } else {
         this.saleCode = ''
       }
@@ -584,7 +671,7 @@ export default {
         const findItem = (arr) => {
             for (let i = 0; i < arr.length; i++) {
                 if (arrayB.includes(arr[i].value)) {
-                    result.push(arr[i].value)  
+                    result.push(arr[i].value)
                 }
                 if (arr[i].children) {
                     let arra = arr[i].children
@@ -637,7 +724,7 @@ export default {
       this.others.contract_archive_num = this.others.contract_archive_num.replace(/[^\d]+/g, '')
     },
     buyHandler() { //过滤字母
-            this.others.buyCount=this.member.buyCount.replace(/[^\d]+/g,'')
+            this.others.buyCount=this.others.buyCount.replace(/[^\d]+/g,'')
     },
     changeHandler() {
       if (this.others.productType == '5') {
@@ -657,7 +744,8 @@ export default {
     reged() {
       this.$request('/order/vipInfo').data({// 验证手机号权限
         phone: this.others.phone,
-        buySubject:this.others.buySubject
+        buySubject:this.others.buySubject,
+        entName: this.others.buySubject === '2' ? this.others.companyName : ''
       }).success((res) => {
         this.phoneReg = res.data
       }).post()
@@ -670,7 +758,8 @@ export default {
         if ((/^1[03456789]\d{9}$/.test(this.others.phone))) {
           this.$request('/order/vipInfo').data({// 验证手机号权限
             phone: this.others.phone,
-            buySubject:this.others.buySubject
+            buySubject:this.others.buySubject,
+            entName: this.others.buySubject === '2' ? this.others.companyName : ''
           }).success((res) => {
             if (res.data) {
               this.infoData = res.data
@@ -680,6 +769,9 @@ export default {
             }
             if (res.data.userData) {
               this.areaNums = res.data.userData
+              // 服务到期时间
+              const l_vip_endtime = res.data.userData?.l_vip_endtime
+              this.serviceEndTime = l_vip_endtime ? dateFormatter(new Date(l_vip_endtime * 1000), 'yyyy-MM-dd') : ''
             }
             if(this.others.buySubject!='2'){// 个人或者不选走原逻辑
 
@@ -722,7 +814,6 @@ export default {
                 this.payChange()
 
             }
-
           }).post()
         }
       }
@@ -831,6 +922,17 @@ export default {
     },
     agreeDate(val) {
       this.others.contractTime = val
+      // 预计回款日期变更
+      this.workDayNumChange()
+    },
+    // 协议状态变更
+    contractStatusChange (val) {
+      if(val === '1' && !this.others.contractTime) {
+        this.others.contractTime = dateFormatter(new Date(), 'yyyy-MM-dd')
+        this.$refs.sigleRef2.dataVals = new Date(this.others.contractTime)
+      }
+      // 预计回款日期变更
+      this.workDayNumChange()
     },
     startsData(val) {
       this.others.startTime = val
@@ -985,6 +1087,19 @@ export default {
         this.$Notice.warning({title: '请选择协议状态'})
         return
       }
+      if(this.others.paybackNum === '') {
+        this.$Notice.warning({title: '请输入回款次数'})
+        return
+      }
+      if(this.others.paybackNum === 1 && (this.others.paybackWorkDayNum === '' || this.others.paybackWorkDayNum === null)) {
+        this.$Notice.warning({title: '请输入回款计划工作日'})
+        return
+      }
+      if(this.others.paybackNum > 1 && !this.paybackTableData.every(item => item.time && item.money)){
+        this.$Notice.warning({ title: '请填写完整回款计划' })
+        return
+      }
+
       // if (this.others.productType == '3') {
       //   if (!this.others.personNum) {
       //     this.$Notice.warning({title: '购买人数不能为空'})
@@ -1096,6 +1211,8 @@ export default {
       })
       let saleName = saleNameArr.join(',')
       let saleId = saleIdArr.join(',')
+      // 多次回款计划列表数据
+      this.others.paybackList = this.paybackTableData
       let obj = {
         ...params,
         contract_nature: this.others.contract_nature,
@@ -1150,8 +1267,13 @@ export default {
         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, // 协议备注
+        paybackWorkDayNum:  this.others.paybackNum == 1 ? this.others.paybackWorkDayNum : '', //回款计划工作日
+        paybackExpectDate:  this.others.paybackNum == 1 ? this.others.paybackExpectDate : '', //预计回款的时间
+        paybackNum: this.others.paybackNum, // 回款次数
+        paybackList:this.others.paybackNum > 1 ? JSON.stringify(this.others.paybackList) : '', // 回款列表
+        paybackOpenServer: this.others.paybackOpenServer, // 全额回款后开通服务
       }
-      var urlVue = ``
+      let urlVue = ``
       if (this.showOrderStatus) {
         urlVue = `/order/createOtherOrder`
       } else {
@@ -1217,11 +1339,165 @@ export default {
           }
         }, 1000)
       }
-    }
+    },
+    // 小数过滤成整数处理
+    filterNonPositiveIntegers(str) {
+      let strs = str + ""
+      let num = strs.replace(/-\d+|[^\d\s,]+/g, '')
+      if (num && num >= 0) {
+        return Number(num)
+      } else {
+        return ''
+      }
+    },
+    // 格式化回款工作日、回款次数。处理回款计划数据
+    formatWorkDayNum (val) {
+      if (val === 'paybackWorkDayNum') {
+        this.others.paybackWorkDayNum = this.filterNonPositiveIntegers(this.others.paybackWorkDayNum)
+        this.workDayNumChange()
+      } else if (val === 'paybackNum' || val === 'contractMoney') {
+        this.others.paybackNum = this.paybackNumReg(this.others.paybackNum)
+        if(this.others.paybackNum > 1){
+          let num = this.others.paybackNum
+          let arr = []
+          for (let i = 0; i <= num; i++) {
+            if(i == num){
+              arr.push({code:'合计',time:'-',money:this.others.contractMoney})
+            }else{
+              arr.push({code:i + 1,time:'',money:''})
+            }
+          }
+          this.paybackTableData = arr
+          this.$nextTick(()=>{
+            this.paybackTableData.forEach((ele,index)=>{
+              if(index < this.paybackTableData.length - 1 ){
+                this.$refs['paybackTime'+index].initd()
+              }
+            })
+          })
+        }else{
+          // 切换一次重置数值
+          this.others.paybackWorkDayNum = ''
+          this.others.paybackExpectDate = ''
+          this.paybackTableData = []
+        }
+      }
+    },
+    // 回款计划表格 change
+    paybackTableChange: debounce(function(row,index,type,e) {
+      if(type == 'money'){
+        // 回款金额未录入时
+        if (!this.others.contractMoney) {
+          this.$Notice.warning({ title: '请先输入合同金额' })
+          this.paybackTableData[index].money = ''
+          return
+        }
+        if(this.paybackmoneyReg(this.paybackTableData[index].money)){
+          let money_ = this.paybackmoneyReg(this.paybackTableData[index].money)
+          this.paybackTableData[index].money = Number(money_).fixed(2)
+        }else{
+          this.paybackTableData[index].money =''
+        }
+        let num = 0
+        this.paybackTableData.forEach((ele,index)=>{
+          if(index < this.paybackTableData.length - 2 ){
+            num += Number(ele.money)
+          }
+        })
+        if(num && this.others.contractMoney){
+          if(Number(this.others.contractMoney ) - Number(num) > 0){
+            this.paybackTableData[this.others.paybackNum -1].money = (Number(this.others.contractMoney ) - Number(num)).fixed(2)
+          }else{
+            this.$Notice.warning({ title: '需小于合同金额' })
+            this.paybackTableData[index].money= ''
+          }
+          this.paybackTableData.forEach((ele)=>{
+            if(ele.code == '合计' ){
+              ele.money = Number(this.others.contractMoney)
+            }
+          })
+        }else{
+          this.paybackTableData[this.others.paybackNum -1].money = ''
+        }
+      }else if(type == 'time'){
+        if(e){
+          this.paybackTableData[index].time = e
+        }
+      }
+    }, 300),
+    // 回款金额校验
+    paybackmoneyReg(val){
+      if (val){
+        let str = this.moneyReg(val + "")
+        if(str == 0 && str !== ''){
+          this.$Notice.warning({ title: '不可为0' })
+          str = ''
+        }else if (Number(str) >= Number(this.others.contractMoney)){
+          this.$Notice.warning({ title: '需小于合同金额' })
+          str = ''
+        }
+        return str
+      } else {
+        return ''
+      }
+    },
+    // 回款次数校验
+    paybackNumReg (val) {
+      let str = val.toString().replace(/-\d+|[^\d\s,]+/g, '')
+      if (str !== "" && str < 1) {
+        this.$Notice.warning({ title: '最小值为1' })
+        str = 1
+      }else if (str > 5){
+        this.$Notice.warning({ title: '最大值为5' })
+        str = 5
+      }
+      if (str && str > 0) {
+        return Number(str)
+      } else {
+        return ''
+      }
+    },
+    moneyReg(val) {
+      return val.replace(/[^\d^\.]+/g, '').replace('.', '$#$').replace(/\./g, '').replace('$#$', '.')
+    },
+    // 回款计划,工作日变更
+    workDayNumChange: debounce(function (){
+      if(this.others.paybackNum != 1){
+        return
+      }
+      this.others.paybackExpectDate = ''
+      // 回款工作日为0
+      if (this.others.paybackWorkDayNum === 0) {
+        if (this.others.contractStatus == '1') {
+          this.others.paybackExpectDate  = dateFormatter(this.others.contractTime, 'yyyy-MM-dd')
+        }else{
+          this.others.paybackExpectDate = dateFormatter(new Date(), 'yyyy-MM-dd')
+        }
+      } else {
+        // 回款工作日不为0
+        let start = ''
+        if (this.others.contractStatus ==='1') { //签协议
+          start = dateFormatter(this.others.contractTime, 'yyyy-MM-dd')
+        } else {//不签协议
+          start = dateFormatter(new Date(), 'yyyy-MM-dd')
+        }
+        if (!this.others.paybackWorkDayNum  || !start) {
+          return
+        }
+        const params = {
+          startDay: start,
+          workDayNum: Number(this.others.paybackWorkDayNum)
+        }
+        this.$request('getWorkDay').contentType('application/json').data(params).success((res) => {
+          if (res.data) {
+            this.others.paybackExpectDate = res.data
+          }
+        }).post('rewritePath')
+      }
+    }, 200)
   },
   data() {
     return {
-      
       saleCode: '',
       saleDep : [],
       saleTable: [
@@ -1234,6 +1510,23 @@ export default {
               slot: 'money'
           }
       ],
+      // 回款计划表格列
+      paybackTable:[
+        {
+          title: '序号',
+          slot: 'code'
+        },
+        {
+          title: '预计回款时间',
+          slot: 'time'
+        },
+        {
+          title: '预计回款金额(元)',
+          slot: 'money'
+        }
+      ],
+      // 多次回款计划表格数据
+      paybackTableData:[],
       saleTableData: [],
       oShow: false,
       isDisable: false,
@@ -1284,7 +1577,7 @@ export default {
         orderChannel: 'd01',
         paybackCompany: 'h01',
         sale_time: dateFormatter(new Date(), 'yyyy-MM-dd') + ' 00:00:00',
-        order_status: '1',
+        order_status: '0',
         contract_archive_status: '0',
         contract_archive_time: '',
         contract_archive_num: '',
@@ -1299,6 +1592,10 @@ export default {
         e_contract_userA_contacts_address: '', // 协议甲方联系地址
         e_contract_userB_contacts_name: '', // 协议乙方联系人
         e_contract_remark: '', // 协议备注
+        paybackWorkDayNum: '', //回款计划工作日
+        paybackExpectDate: '', //预计回款的时间
+        paybackOpenServer: false, // 全额回款后开通服务
+        paybackNum: 1 // 回款次数
       },
       otherPro: [
         {v: '1', n: '广告'},
@@ -1350,7 +1647,10 @@ export default {
         {v: '3', n: '自定义字段包'}
       ],
       showXieYi: false,
-      showOrderOther: false
+      // 本次新增的areaCount
+      addAreaCount: 0,
+      // 超级订阅升级-服务到期时间
+      serviceEndTime: dateFormatter(new Date(), 'yyyy-MM-dd')
     }
   }
 }
@@ -1365,4 +1665,28 @@ export default {
 .ivu-form-item{
   margin-bottom: 10px;
 }
+.cycle-tip {
+  color:#f00;
+  font-size:12px;
+  margin-top:8px;
+  margin-left:5px;
+}
+::v-deep {
+  .ivu-input-number-handler-wrap{
+    display: none;
+  }
+  .service-date-picker{
+    .lines2{
+      margin: 0 5px;
+    }
+    .ivu-date-picker{
+      margin-right:0 !important;
+      width:154px !important;
+    }
+    .ivu-input {
+      width:154px !important;
+      font-size:12px;
+    }
+  }
+}
 </style>

+ 429 - 94
src/views/order/components/otherOrderEdit.vue

@@ -15,19 +15,19 @@
             <FormItem label="合同性质" required>
               <!-- 订单状态为“已完成”,不支持修改。 -->
               <RadioGroup v-model="others.contract_nature">
-                <Radio label="1" style="margin-right:30px" :disabled="others.order_status=='1'">新签合同</Radio>
-                <Radio label="2" :disabled="others.order_status=='2'">续签合同</Radio>
+                <Radio label="1" style="margin-right:30px" :disabled="others.order_status=='1' || returnDisabledStatus">新签合同</Radio>
+                <Radio label="2" :disabled="others.order_status=='2' || returnDisabledStatus">续签合同</Radio>
               </RadioGroup>
             </FormItem>
             <FormItem label="购买主体" required>
               <RadioGroup v-model="others.buySubject" @on-change="radiosChange">
-                <Radio label="1" style="margin-right:30px" :disabled="radio_dis || finish_dis">个人</Radio>
-                <Radio label="2" :disabled="radio_dis || finish_dis">企业</Radio>
+                <Radio label="1" style="margin-right:30px" :disabled="radio_dis || finish_dis || returnDisabledStatus">个人</Radio>
+                <Radio label="2" :disabled="radio_dis || finish_dis || returnDisabledStatus">企业</Radio>
               </RadioGroup>
             </FormItem>
           </div>
           <FormItem label="公司名称" prop="" :required="others.buySubject == '2'">
-            <Input v-model.trim="others.companyName" type="text" :maxlength="40" :disabled="finish_dis" placeholder="请输入公司名称"></Input>
+            <Input v-model.trim="others.companyName" type="text" :maxlength="40" :disabled="finish_dis || returnDisabledStatus" placeholder="请输入公司名称"></Input>
           </FormItem>
           <FormItem :label-width="121" label="开通权益手机号" prop="phone" :class="{'phone-tip':others.productType == '1'||others.productType == '6'||others.productType == '7'||others.productType == '8'||others.productType == '9'||others.productType == '11'||others.productType == '12'||others.productType=='14'}">
             <Input
@@ -42,75 +42,88 @@
           </FormItem>
           <FormItem label="产品类型" required prop="productType">
             <RadioGroup v-model="others.productType" @on-change="goodChange">
-              <Radio :label="item.v" :disabled="interested || typeRestriction || isEnterprise"  v-for="item in otherPro" :key="item.v">{{ item.n }}</Radio>
+              <Radio :label="item.v" :disabled="interested || typeRestriction || isEnterprise || returnDisabledStatus"  v-for="item in otherPro" :key="item.v">{{ item.n }}</Radio>
             </RadioGroup>
           </FormItem>
           <div class="flex-endbox">
             <FormItem label="购买产品" v-if="others.productType == '2'">
               <RadioGroup v-model="others.product" placeholder="请选择购买产品">
-                <Radio v-for="item in buyPro" :label="item.v" :key="item.v">{{ item.n }}</Radio>
+                <Radio v-for="item in buyPro" :label="item.v" :key="item.v" :disabled="returnDisabledStatus">{{ item.n }}</Radio>
               </RadioGroup>
             </FormItem>
             <FormItem label="数据条数" v-if="others.productType == '2'||others.productType == '4'">
-              <Input v-model="others.dataNum" type="text" :maxlength="8" placeholder="请输入数据条数" @on-keyup="numHandler"></Input>
+              <Input v-model="others.dataNum" type="text" :maxlength="8" placeholder="请输入数据条数" @on-keyup="numHandler" :disabled="returnDisabledStatus"></Input>
             </FormItem>
           </div>
           <FormItem label="广告来源" prop="adSource" v-show="others.productType == '1'">
-            <Select v-model="others.adSource" placeholder="请选择广告来源">
+            <Select v-model="others.adSource" placeholder="请选择广告来源" :disabled="returnDisabledStatus">
               <Option v-for="item in adFrom" :value="item.v" :key="item.v">{{ item.n }}</Option>
             </Select>
           </FormItem>
-          <FormItem label="字段类型" v-if="others.productType == '2'||others.productType == '4'">
-            <RadioGroup v-model="others.dataType" >
-              <Radio v-for="item in fieldStas" :label="item.v" :key="item.v">{{ item.n }}</Radio>
-            </RadioGroup>
-          </FormItem>
-          <FormItem label="服务起止时间" v-if="others.productType !== '5'">
-            <f-date ref="dateRef" :placeholder1="'请选择服务开始时间'" :placeholder2="'请选择服务结束时间'" @startsData="startsData"
-                    @endsData="endsData"></f-date>
-          </FormItem>
+          <div class="flex-endbox">
+            <FormItem label="字段类型" v-if="others.productType == '2'||others.productType == '4'">
+              <RadioGroup v-model="others.dataType" >
+                <Radio v-for="item in fieldStas" :label="item.v" :key="item.v" :disabled="returnDisabledStatus">{{ item.n }}</Radio>
+              </RadioGroup>
+            </FormItem>
+            <FormItem label="服务起止时间" v-if="others.productType !== '5'">
+              <f-date class="service-date-picker" ref="dateRef" :placeholder1="'请选择服务开始时间'" :placeholder2="'请选择服务结束时间'" @startsData="startsData"
+                      @endsData="endsData"></f-date>
+            </FormItem>
+          </div>
+
           <FormItem label="付费类型" required v-show="others.productType == '5'">
             <RadioGroup v-model="others.vipType" @on-change="payChange">
-              <Radio label="0" :disabled="gouDis || payDis">购买</Radio>
-              <Radio label="1" :disabled="payDis">续费</Radio>
-              <Radio label="2" :disabled="payDis">升级</Radio>
+              <Radio label="0" :disabled="gouDis || payDis || returnDisabledStatus">购买</Radio>
+              <Radio label="1" :disabled="payDis || returnDisabledStatus">续费</Radio>
+              <Radio label="2" :disabled="payDis || returnDisabledStatus">升级</Radio>
             </RadioGroup>
           </FormItem>
           <FormItem label="购买数量" required v-show="others.buySubject == '2' && (others.productType == '5' || others.productType == '3')">
-            <Input v-model="others.buyCount" type="tel" maxlength="4" @on-keyup="buyHandler" placeholder="请填写购买数量" :disabled="finish_dis"></Input>
+            <Input v-model="others.buyCount" type="tel" maxlength="4" @on-keyup="buyHandler" placeholder="请填写购买数量" :disabled="finish_dis || returnDisabledStatus"></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'" style="color:#ed4014;font-size:13px;line-height:20px">
+            <city-select ref="cityArea" :stopCheck="stopCheck || returnDisabledStatus" @provinceSel="provinceSel"></city-select>
+<!--            <div v-show="others.vipType=='1'||others.vipType=='2'" style="color:#ed4014;font-size:13px;line-height:20px">-->
+<!--              原套餐购买省份:{{ areaNums.areaCount == 0 ? '全国' : areaNums.areaCount + '个' }}-->
+<!--              <span v-show="others.vipType == '2'">,注意:订阅的区域会调整为此次升级选择的省份,请提前与用户确认升级省份</span>-->
+<!--            </div>-->
+            <div v-show="others.vipType=='1'" style="color:#ed4014;font-size:13px;line-height:20px">
               原套餐购买省份:{{ areaNums.areaCount == 0 ? '全国' : areaNums.areaCount + '个' }}
-              <span v-show="others.vipType == '2'">,注意:订阅的区域会调整为此次升级选择的省份,请提前与用户确认升级省份</span>
+            </div>
+            <div v-show="others.vipType=='2'" style="color:#ed4014;font-size:13px;line-height:20px">
+              注:服务到期时间:{{ serviceEndTime }},原套餐购买省份:{{ areaNums.areaCount == 0 ? '全国' : areaNums.areaCount + '个' }},
+              {{ '此次增购' + addAreaCount + '个' }}
+              <span>,注意:订阅的区域会调整为此次升级选择的省份,请提前与用户确认升级省份</span>
             </div>
           </FormItem>
           <div class="two-val" style="display:flex" v-show="others.productType == '5'">
             <FormItem required label="有效周期" prop="cycleCount" style="display:flex">
               <Input
+                  style="width:130px;"
                   v-model="others.cycleCount"
                   type="text"
                   @on-keyup="others.cycleCount=others.cycleCount.replace(/[^\d]+/g,'')"
                   :maxlength="12"
                   placeholder="请输入有效周期"
-                  :disabled="others.vipType=='2' || interested"
-                  style="width:476px"
+                  :disabled="others.vipType=='2' || interested || returnDisabledStatus"
               ></Input>
             </FormItem>
-            <FormItem prop="cycleUnit" style="margin-left:10px">
-              <Select v-model="others.cycleUnit" placeholder="请选择单位" :disabled="others.vipType=='2' || interested"
+            <FormItem prop="cycleUnit" style="margin-left:10px;width:110px;">
+              <Select v-model="others.cycleUnit" placeholder="请选择单位" :disabled="others.vipType=='2' || interested || returnDisabledStatus"
                       style="width:110px;">
                 <Option v-for="item in unitOptions" :value="item.v" :key="item.v">{{ item.n }}</Option>
               </Select>
             </FormItem>
-          </div>
-          <div v-show="others.productType == '5'">
-            <FormItem label="开始日期" prop="vipStartTime">
+
+            <span class="cycle-tip" v-if="showCycleTip">全额回款后将自动续费开通权益,如若回款时间晚于原服务到期时间,则开始日期为回款日期。</span>
+
+            <FormItem label="开始日期" prop="vipStartTime" v-if="others.vipType=='0'">
               <date-sigle
+                  style="width: 120px;"
                   ref="sigleRef1"
                   :dateType="'date'"
-                  :placeholderd="'请选择开始日期'"
+                  :placeholderd="'请选择'"
                   @startDate="startDate1"
                   :disabledDateCallback="disabledDateForVIPCallback"
                   class="no-pass"
@@ -120,7 +133,12 @@
               <Checkbox v-model="noPass" @on-change="noTchange"
                         :disabled="others.vipType!=='0' || interested || (!returnMyOther&&others.vipType === '0')">暂不开通
               </Checkbox>
+              <Checkbox  v-model="others.paybackOpenServer"
+                         :disabled="(returnMyOther && !noPass) || (others.vipType!=='0') || (!returnMyOther && others.vipType === '0')">全额回款当日自动开通
+              </Checkbox>
             </FormItem>
+          </div>
+          <div v-show="others.productType == '5'">
 
             <!-- <FormItem label="计费模式" prop="chargeMode">
               <Select v-model="others.chargeMode" placeholder="请选择计费模式" @on-change="jiChange">
@@ -138,7 +156,7 @@
                   :readonly="readon"
                   :maxlength="9"
                   @on-keyup="keyupSale('2')"
-                  :disabled="finish_dis"
+                  :disabled="finish_dis || returnDisabledStatus"
               ></Input>
               <span class="money-unit">元</span>
             </FormItem>
@@ -157,7 +175,7 @@
                   :readonly="readon"
                   :maxlength="9"
                   @on-keyup="keyupSale('3')"
-                  :disabled="finish_dis"
+                  :disabled="finish_dis || returnDisabledStatus"
               ></Input>
               <span class="money-unit">元</span>
             </FormItem>
@@ -170,7 +188,7 @@
                   :readonly="readon"
                   :maxlength="9"
                   @on-keyup="keyupSale('4')"
-                  :disabled="finish_dis"
+                  :disabled="finish_dis || returnDisabledStatus"
               ></Input>
               <span class="money-unit">元</span>
             </FormItem>
@@ -179,7 +197,7 @@
           </FormItem>
           <div class="flex-endbox">
             <FormItem label="协议状态" required prop="contractStatus">
-              <RadioGroup v-model="others.contractStatus" >
+              <RadioGroup v-model="others.contractStatus" @on-change="contractStatusChange">
                 <Radio v-for="item in agreeStatus" :label="item.v" :key="item.v">{{ item.n }}</Radio>
               </RadioGroup>
             </FormItem>
@@ -197,24 +215,7 @@
               <Input v-model="others.contractCode" type="text" placeholder="请输入协议编号"></Input>
             </FormItem>
           </div>
-            <OnlineContractForm
-              ref="onlineContractFormRef"
-              v-if="showOnlineContractForm"
-              :showMore="showXieYi && 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"
-            />
-          <div v-show="showOpenXieYi">
+          <div>
             <div class="flex-endbox">
               <FormItem label="协议归档状态" v-if="others.contractStatus == '1'">
                 <RadioGroup v-model="others.contract_archive_status" >
@@ -230,7 +231,7 @@
             <div class="flex-endbox">
               <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>
+                       placeholder="请输入归档份数"></Input>
               </FormItem>
               <FormItem label="归档协议" class="chuan-pay" v-show="others.contract_archive_status == '1'">
                 <b-upload
@@ -245,12 +246,77 @@
               </FormItem>
             </div>
           </div>
+          <OnlineContractForm
+            ref="onlineContractFormRef"
+            v-if="showOnlineContractForm"
+            :showMore="showOpenXieYi"
+            :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"
+            :has-disabled= "returnDisabledStatus"
+            :disabled-filed = "['e_contract_remark']"
+          />
+
           <div style="display: flex;justify-content: center;" v-show="!showOpenXieYi">
             <div @click="showXieYi = !showXieYi" style="color: #36a3f7;cursor: pointer; font-size: 14px;">
               <span>更多信息</span>
               <i class="el-icon-arrow-down"></i>
             </div>
           </div>
+
+          <!--回款计划start-->
+          <FormItem label="回款计划" class="formTitle"></FormItem>
+           <FormItem  label="回款次数"  required>
+             <Input v-model.trim="others.paybackNum" type="text" @on-keyup="formatWorkDayNum('paybackNum')"
+                    :disabled="returnDisabledStatus"
+                    style="width: 80px;margin-right:5px;"></Input>次
+           </FormItem>
+          <!--回款列表-->
+          <FormItem label="" v-show="others.paybackNum > 1">
+            <Table border :columns="paybackTable" :data="paybackTableData">
+              <template slot-scope="{ row }" slot="code">
+                <strong>{{ row.code }}</strong>
+              </template>
+              <template slot-scope="{ row, index }" slot="time">
+                <strong v-if="row.code == '合计'">-</strong>
+                <date-sigle
+                    :ref="'paybackTime'+index"
+                    :dateType="'date'"
+                    :dataV="paybackTableData[index].time"
+                    :placeholderd="'请选择'"
+                    :dateDis="returnDisabledStatus"
+                    @startDate="paybackTableChange(row,index,'time',$event)"
+                    :overTime="0" v-else></date-sigle>
+              </template>
+              <template slot-scope="{ row, index }" slot="money">
+                <strong v-if="row.code == '合计'">{{ others.contractMoney || '-' }}</strong>
+                <Input @mousewheel.native.prevent @DOMMouseScroll.native.prevent
+                        v-model="paybackTableData[index].money"
+                       @on-keyup="paybackTableChange(row,index,'money')"
+                       type="number" placeholder="请输入" :disabled="index + 1  == others.paybackNum || returnDisabledStatus" v-else></Input>
+              </template>
+            </Table>
+          </FormItem>
+          <FormItem style="padding-left:30px;" label=" " :label-width="0" required v-show="others.paybackNum==1">
+            <div>
+              <span>{{others.contractStatus == '1' ? '自协议签订之日起': '自订单创建之日起'}}</span>
+              <Input v-model="others.paybackWorkDayNum" type="text" @on-keyup="formatWorkDayNum('paybackWorkDayNum')"
+                     style="width: 80px;margin-left:10px;margin-right: 10px;"
+                     :disabled="returnDisabledStatus"></Input>
+              个工作日回款,预计回款时间:<span v-if="others.paybackExpectDate "  style="color: #36a3f7">{{ others.paybackExpectDate }}</span><span v-else>-</span>
+            </div>
+          </FormItem>
+          <!--回款计划end-->
+
           <FormItem label="业绩归属" class="formTitle">
           </FormItem>
           <div class="flex-endbox">
@@ -296,24 +362,18 @@
                           @levelChange="channelChange" v-if="oShow"></v-cascader>
             </FormItem>
           </div>
-          <div v-show="showOrderOther">
+          <div>
             <FormItem label="订单备注">
               <Input v-model="others.remark" type="text" :maxlength="40" placeholder="请输入订单备注"></Input>
             </FormItem>
-            <FormItem label="订单状态" prop="order_status" v-if="returnMyOther">
+            <FormItem label="订单状态" prop="order_status">
               <Select v-model="others.order_status" placeholder="请选择订单状态">
                 <Option value="0" :disabled="noFinishDis || finish_dis">未完成</Option>
-                <Option value="1" :disabled="finishDis || finish_dis">已完成</Option>
+                <Option v-if="returnMyOther" value="1" :disabled="finishDis || finish_dis">已完成</Option>
                 <Option value="-2" :disabled="cancelDis || interested || finish_dis">已取消</Option>
               </Select>
             </FormItem>
           </div>
-          <div style="display: flex;justify-content: center;" v-show="!showOrderOther">
-            <div @click="showOrderOther = !showOrderOther" style="color: #36a3f7;cursor: pointer; font-size: 14px;">
-              <span>更多信息</span>
-              <i class="el-icon-arrow-down"></i>
-            </div>
-          </div>
         </Form>
       </div>
 
@@ -362,6 +422,7 @@ import saleSelect from './salesSelect.vue'
 import {dateFormatter} from '@/assets/js/date'
 import chinaMapJSON from "@/assets/js/china_area.js";
 import { Icon } from 'element-ui'
+import { debounce } from '@/helper.js'
 
 export default {
   name: 'EditOtherOrderModal',
@@ -417,11 +478,19 @@ export default {
     },
     addEventListenerVip () {
       return this.others.productType + this.others.cycleCount + this.others.cycleUnit + this.others.vipStartTime + this.others.buySubject + this.others.buyCount + this.others.area + this.areaNums.areaCount
-    }
+    },
+    // 展示有效周期提示,展示条件:【产品类型为超级订阅,付费类型为续费】、【产品类型为大会员,购买主体为个人,延长服务】
+    showCycleTip () {
+      const isVipAndRenew = this.others.productType === '5' && this.others.vipType === '1'
+      return isVipAndRenew
+    },
+    // P504需求全部订单-编辑其他订单,全部订单、“订单审核状态”为已通过,订单状态为“未完成”时
+    returnDisabledStatus () {
+      return this.returnMyOther && this.originAuditStatus == 3  && Number(this.originOrderStatus) === 0
+    },
   },
   watch: {
     addEventListenerVip (val) {
-      console.log(val)
       let areaCount = 0
       const _this = this
       let {area, cycleCount, cycleUnit, vipStartTime, buySubject, buyCount, vipType, phone, productType} = this.others
@@ -434,21 +503,31 @@ export default {
         } else {
           // 大于等于16个省相当于全国,areaCount = 0
           if(area.split(',').length >= 16) {
-            areaCount = 0
+            if(productType == '5' && vipType === '2') {
+              areaCount = area.split(',').length
+            } else {
+              areaCount = 0
+            }
           } else {
             areaCount = area.split(',').length
           }
         }
+        if(productType == '5' && vipType === '2') {
+          // 本次新增的省份(全国即表示16个省份)
+          this.addAreaCount = areaCount === 0 ? (16 - this.areaNums.areaCount)  : (areaCount - this.areaNums.areaCount)
+        }
       } else {
         if (this.areaNums.areaCount && this.areaNums.areaCount > 0) {
           areaCount = this.areaNums.areaCount
         } else {
           areaCount = 0
         }
+        this.addAreaCount = this.areaNums.areaCount * -1
       }
       if(buySubject == '1') {
         buyCount = '1'
       }
+
       if (buySubject && buyCount && vipType && productType == '5') {
         const url = '/order/orderPriceCount'
         this.$request(url).data({
@@ -463,20 +542,11 @@ export default {
           originalAreaCount: this.areaNums.areaCount,
           phone: vipType == '2' ? phone : ''
         }).success((resdata) => {
-          console.log(resdata, 'resdata')
           if(resdata.status === 'success') {
             _this.others.orderMoney = resdata.data.price
           }
         }).post()
       }
-    },
-    'others.remark': {
-      handler (val) {
-        if(this.title === '创建订单审核' || val) {
-          this.showOrderOther = true
-        }
-      },
-      immediate: true
     }
   },
   created () {
@@ -494,6 +564,8 @@ export default {
     },
     inited() {// 初始化
       // this.$refs['others'].resetFields()
+      // 回款计划列表数据初始化
+      this.paybackTableData = []
       this.$refs.uploadRef.uploadShow = false
       this.$refs.uploadRef.payHtml = ''
       this.noPass = false
@@ -535,7 +607,7 @@ export default {
         if (sigs6) {
           this.$refs.sigleRef5.initd()
         }
-      }, 100)
+      }, 200)
       Object.keys(this.others).forEach(key => {
         if (key == 'area') {
           return
@@ -547,7 +619,11 @@ export default {
           this.others[key] = '0'
         } else if (key.startsWith('e_contract_')) {
           this.others[key] = this.$options.data().others[key]
-        } else {
+        } else if (key === 'paybackOpenServer') {
+          this.others.paybackOpenServer = false
+        } else if (key==='paybackNum') {
+          this.others.paybackNum = 1
+        } {
           this.others[key] = ''
         }
       })
@@ -557,6 +633,8 @@ export default {
         this.others.orderMoney = this.conHandler(this.others.orderMoney)
       } else if (val === '2') {
         this.others.contractMoney = this.conHandler(this.others.contractMoney)
+        // 多次回款回款计划列表数据
+        this.formatWorkDayNum('contractMoney')
       } else if (val === '3') {
         this.others.commission = this.conHandler(this.others.commission)
       } else if (val === '4') {
@@ -608,7 +686,7 @@ export default {
         const findItem = (arr) => {
             for (let i = 0; i < arr.length; i++) {
                 if (arrayB.includes(arr[i].value)) {
-                    result.push(arr[i].value)  
+                    result.push(arr[i].value)
                 }
                 if (arr[i].children) {
                     let arra = arr[i].children
@@ -678,7 +756,7 @@ export default {
           this.checkVip(1)
         },
     buyHandler() { //过滤字母
-            this.others.buyCount=this.member.buyCount.replace(/[^\d]+/g,'')
+            this.others.buyCount=this.others.buyCount.replace(/[^\d]+/g,'')
     },
     timeReg(val) {
       return new Date(val + ' 00:00:00').getTime() / 1000
@@ -708,7 +786,8 @@ export default {
     reged() {
       this.$request('/order/vipInfo').data({// 验证手机号权限
         phone: this.others.phone,
-        buySubject:this.others.buySubject
+        buySubject:this.others.buySubject,
+        entName: this.others.buySubject === '2' ? this.others.companyName : ''
       }).success((res) => {
         this.phoneReg = res.data
       }).post()
@@ -719,7 +798,8 @@ export default {
           this.$request('/order/vipInfo').data({// 验证手机号权限
             phone: this.others.phone,
             orderCode: this.others.orderCode,
-            buySubject:this.others.buySubject
+            buySubject:this.others.buySubject,
+            entName: this.others.buySubject === '2' ? this.others.companyName : ''
           }).success((res) => {
             if (res.data) {
               this.infoData = res.data
@@ -729,6 +809,9 @@ export default {
             }
             if (res.data.userData) {
               this.areaNums = res.data.userData
+              // 服务到期时间
+              const l_vip_endtime = res.data.userData?.l_vip_endtime
+              this.serviceEndTime = l_vip_endtime ? dateFormatter(new Date(l_vip_endtime * 1000), 'yyyy-MM-dd') : ''
             }
             if (res.data.willEffect == true && !this.readonly) { // 存在即将生效的超级订阅订单
               if(this.others.buySubject!='2'){ //个人走原逻辑
@@ -894,6 +977,17 @@ export default {
     },
     agreeDate(val) {
       this.others.contractTime = val
+      // 预计回款日期变更
+      this.workDayNumChange()
+    },
+    // 协议状态变更
+    contractStatusChange (val) {
+      if(val === '1' && !this.others.contractTime) {
+        this.others.contractTime = dateFormatter(new Date(), 'yyyy-MM-dd')
+        this.$refs.sigleRef2.dataVals = new Date(this.others.contractTime)
+      }
+      // 预计回款日期变更
+      this.workDayNumChange()
     },
     startsData(val) {
       this.others.startTime = val
@@ -1038,6 +1132,14 @@ export default {
         this.$Notice.warning({title: '请选择协议状态'})
         return
       }
+      if(this.others.paybackNum === 1 && (this.others.paybackWorkDayNum === '' || this.others.paybackWorkDayNum === null)) {
+        this.$Notice.warning({title: '请输入回款计划工作日'})
+        return
+      }
+      if(this.others.paybackNum > 1 && !this.paybackTableData.every(item => item.time && item.money)){
+        this.$Notice.warning({ title: '请填写完整回款计划' })
+        return
+      }
       // if (this.others.productType == '3') {
       //   if (!this.others.personNum) {
       //     this.$Notice.warning({title: '购买人数不能为空'})
@@ -1148,6 +1250,8 @@ export default {
       })
       let saleName = saleNameArr.join(',')
       let saleId = saleIdArr.join(',')
+      // 多次回款计划列表数据
+      this.others.paybackList = this.paybackTableData
       let obj = {
         orderCode: this.others.orderCode,
         createTime: this.others.createTime,
@@ -1203,6 +1307,11 @@ export default {
         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, // 协议备注
+        paybackWorkDayNum: this.others.paybackNum == 1 ? this.others.paybackWorkDayNum : '', //回款计划工作日
+        paybackExpectDate: this.others.paybackNum == 1 ? this.others.paybackExpectDate : '', //预计回款的时间
+        paybackNum: this.others.paybackNum, // 回款次数
+        paybackList:this.others.paybackNum > 1 ?  JSON.stringify(this.others.paybackList) : '', // 回款列表
+        paybackOpenServer: this.others.paybackOpenServer // 全额回款后开通服务
       }
       this.isDisable = true
       var submitUrl = ''
@@ -1246,6 +1355,12 @@ export default {
       this.typeRestriction = true
       const {contractRes, filterData, refundRes, res, returnInfo, returnRes, audit} = data
       setTimeout(() => {
+        // 已提交订单一些数据
+        // 已提交过的原订单状态 res.orderStatus
+        this.originOrderStatus = res.orderStatus
+        // 原订单审核状态 audit_status == 3 已通过
+        this.originAuditStatus =  res.audit_status
+
         this.orderCode = res.order_code
         if (this.$refs.othersReviewRecord) {
           this.$refs.othersReviewRecord.recordList = audit
@@ -1286,7 +1401,9 @@ export default {
 
         //vip开始时间
         setTimeout(() => {
-          this.$refs.sigleRef1.dataVals = res.vip_starttime
+          if(this.$refs.sigleRef1) {
+            this.$refs.sigleRef1.dataVals = res.vip_starttime
+          }
           if (res.vip_starttime == '2099-01-01 00:00:00') {
             this.noPass = true
           } else {
@@ -1297,7 +1414,7 @@ export default {
           } else {
             this.noPass1 = false
           }
-        }, 200)
+        }, 100)
 
         //协议签订时间
         if (contractRes.contract_status == 1 && contractRes.contract_time) {
@@ -1378,11 +1495,12 @@ export default {
 
         if(res.orderStatus == 1){//回显订单已完成禁用购买主体
           this.finish_dis=true
-          this.$refs.dateRef.isDis = true
+         if(this.$refs.dateRef ) {
+           this.$refs.dateRef.isDis = true
+         }
         }else{
           this.finish_dis=false
         }
-
         this.others = {
           orderCode: res.order_code,
           id: res.id,
@@ -1429,8 +1547,8 @@ export default {
             username: res.salesperson
           }), //
           // salesPersonId: res.salesperson_id //
-          payType: res.payTypes,  
-          saleCodeModel: res.saleDep,
+          payType: res.payTypes,
+          saleCodeModel: typeof res.saleDep === 'string' ? [res.saleDep] : res.saleDep,
           // 电子协议相关
           e_contract_type: contractRes.seal_type || 1, // 电子协议类型
           e_contract_userA_type: contractRes.partyA_type || 1, // 协议甲方类型
@@ -1440,18 +1558,33 @@ export default {
           e_contract_userA_contacts_address: contractRes.partyA_address, // 协议甲方联系地址
           e_contract_userB_contacts_name: contractRes.partyB_person, // 协议乙方联系人
           e_contract_remark: contractRes.remark, // 协议备注
+          paybackWorkDayNum: filterData.paybackWorkDayNum, //回款计划工作日
+          paybackExpectDate: filterData.paybackExpectDate, //预计回款的时间
+          paybackOpenServer: filterData.paybackOpenServer, // 全额回款后开通服务
+          paybackNum: filterData.paybackNum ? filterData.paybackNum : 1, // 回款次数
+          paybackList: filterData.paybackList ? JSON.parse(filterData.paybackList) : [], //多次回款, 回款计划表格
+        }
+        // 回款计划列表回显
+        this.paybackTableData = filterData.paybackList ? JSON.parse(filterData.paybackList) : []
+        if(this.paybackTableData.length > 0){
+          this.$nextTick(()=>{
+            this.paybackTableData.forEach((ele,index)=>{
+              if(index < this.paybackTableData.length - 1 ){
+                this.$refs['paybackTime'+index].dataVals = ele.time
+              }
+            })
+          })
         }
         setTimeout(() => {
           this.startDate1(res.vip_starttime)
         }, 200);
-        if (productType == "5") {
+        if (productType == "5" && !this.readonly) {
           this.checkVip(1)
         }
         if(this.others.buySubject=='2'){ //购买主体为企业 禁用 产品类型和付费类型
           this.isEnterprise=true
         }
       })
-
       this.oShow = true
     },
     formatDate(dateString) {
@@ -1487,7 +1620,157 @@ export default {
           this.cancel = false
         },500)
       }).post()
-    }
+    },
+    // 小数过滤成整数处理
+    filterNonPositiveIntegers(str) {
+      let strs = str + ""
+      let num = strs.replace(/-\d+|[^\d\s,]+/g, '')
+      if (num && num >= 0) {
+        return Number(num)
+      } else {
+        return ''
+      }
+    },
+    // 格式化回款工作日、回款次数。处理回款计划数据
+    formatWorkDayNum (val) {
+      if (val === 'paybackWorkDayNum') {
+        this.others.paybackWorkDayNum = this.filterNonPositiveIntegers(this.others.paybackWorkDayNum)
+        this.workDayNumChange()
+      } else if (val === 'paybackNum' || val === 'contractMoney') {
+        this.others.paybackNum = this.paybackNumReg(this.others.paybackNum)
+        if(this.others.paybackNum > 1){
+          let num = this.others.paybackNum
+          let arr = []
+          for (let i = 0; i <= num; i++) {
+            if(i == num){
+              arr.push({code:'合计',time:'-',money:this.others.contractMoney})
+            }else{
+              arr.push({code:i + 1,time:'',money:''})
+            }
+          }
+          this.paybackTableData = arr
+          this.$nextTick(()=>{
+            this.paybackTableData.forEach((ele,index)=>{
+              if(index < this.paybackTableData.length - 1 ){
+                this.$refs['paybackTime'+index].initd()
+              }
+            })
+          })
+        }else{
+          // 切换一次重置数值
+          this.others.paybackWorkDayNum = ''
+          this.others.paybackExpectDate = ''
+          this.paybackTableData = []
+        }
+      }
+    },
+    paybackTableChange (row,index,type,e) { // 回款计划表格 change
+      if(type == 'money'){
+        // 回款金额未录入时
+        if (!this.others.contractMoney) {
+          this.$Notice.warning({ title: '请先输入合同金额' })
+          this.paybackTableData[index].money = ''
+          return
+        }
+        if(this.paybackmoneyReg(this.paybackTableData[index].money)){
+          let money_ = this.paybackmoneyReg(this.paybackTableData[index].money)
+          this.paybackTableData[index].money = Number(money_).fixed(2)
+        }else{
+          this.paybackTableData[index].money =''
+        }
+        let num = 0
+        this.paybackTableData.forEach((ele,index)=>{
+          if(index < this.paybackTableData.length - 2 ){
+            num += Number(ele.money)
+          }
+        })
+        if(num && this.others.contractMoney){
+          if(Number(this.others.contractMoney ) - Number(num) > 0){
+            this.paybackTableData[this.others.paybackNum -1].money = (Number(this.others.contractMoney ) - Number(num)).fixed(2)
+          }else{
+            this.$Notice.warning({ title: '需小于合同金额' })
+            this.paybackTableData[index].money= ''
+          }
+          this.paybackTableData.forEach((ele)=>{
+            if(ele.code == '合计' ){
+              ele.money = Number(this.others.contractMoney)
+            }
+          })
+        }else{
+          this.paybackTableData[this.others.paybackNum -1].money = ''
+        }
+      }else if(type == 'time'){
+        if(e){
+          this.paybackTableData[index].time = e
+        }
+      }
+    },
+    // 回款金额校验
+    paybackmoneyReg(val){
+      if (val){
+        let str = this.moneyReg(val + "")
+        if(str === 0 && str !== ''){
+          this.$Notice.warning({ title: '不可为0' })
+          str = ''
+        }else if (Number(str) >= Number(this.others.contractMoney)){
+          this.$Notice.warning({ title: '需小于合同金额' })
+          str = ''
+        }
+        return str
+      } else {
+        return ''
+      }
+    },
+    // 回款次数校验
+    paybackNumReg (val) {
+      let str = val.toString().replace(/-\d+|[^\d\s,]+/g, '')
+      if (str !== "" && str < 1) {
+        this.$Notice.warning({ title: '最小值为1' })
+        str = 1
+      }else if (str > 5){
+        this.$Notice.warning({ title: '最大值为5' })
+        str = 5
+      }
+      if (str && str > 0) {
+        return Number(str)
+      } else {
+        return ''
+      }
+    },
+    moneyReg(val) {
+      return val.replace(/[^\d^\.]+/g, '').replace('.', '$#$').replace(/\./g, '').replace('$#$', '.')
+    },
+    // 回款计划,工作日变更
+    workDayNumChange: debounce(function (){
+      this.others.paybackExpectDate = ''
+      // 回款工作日为0
+      if (this.others.paybackWorkDayNum === 0) {
+        if (this.others.contractStatus == '1') {
+          this.others.paybackExpectDate  = dateFormatter(this.others.contractTime, 'yyyy-MM-dd')
+        }else{
+          this.others.paybackExpectDate = dateFormatter(new Date(), 'yyyy-MM-dd')
+        }
+      } else {
+        let start = ''
+        if (this.others.contractStatus ==='1') { //签协议
+          start = dateFormatter(this.others.contractTime, 'yyyy-MM-dd')
+        } else {//不签协议
+          start = dateFormatter(new Date(), 'yyyy-MM-dd')
+        }
+        if (!this.others.paybackWorkDayNum  || !start) {
+          return
+        }
+        const params = {
+          startDay: start,
+          workDayNum: Number(this.others.paybackWorkDayNum)
+        }
+        this.$request('getWorkDay').contentType('application/json').data(params).success((res) => {
+          if (res.data) {
+            this.others.paybackExpectDate = res.data
+          }
+        }).post('rewritePath')
+      }
+    }, 200)
   },
   data() {
     return {
@@ -1503,6 +1786,23 @@ export default {
               slot: 'money'
           }
       ],
+      // 回款计划表格列
+      paybackTable:[
+        {
+          title: '序号',
+          slot: 'code'
+        },
+        {
+          title: '预计回款时间',
+          slot: 'time'
+        },
+        {
+          title: '预计回款金额(元)',
+          slot: 'money'
+        }
+      ],
+      // 多次回款计划表格数据
+      paybackTableData:[],
       saleTableData: [],
       isEnterprise:false,
       radio_dis:false,
@@ -1578,6 +1878,9 @@ export default {
         e_contract_userA_contacts_address: '', // 协议甲方联系地址
         e_contract_userB_contacts_name: '', // 协议乙方联系人
         e_contract_remark: '', // 协议备注
+        paybackWorkDayNum: '', //回款计划工作日
+        paybackExpectDate: '', //预计回款的时间
+        paybackOpenServer: false // 全额回款后开通服务
       },
       ruleValidate: {
         phone: [{required: true}],
@@ -1656,12 +1959,44 @@ export default {
         reason: ""
       },
       showXieYi: false,
-      showOrderOther: false
+      // 本次新增的areaCount
+      addAreaCount: 0,
+      // 已提交过的原订单状态
+      originOrderStatus: 0,
+      // 原订单审核状态
+      originAuditStatus: 0,
+      // 超级订阅升级-服务到期时间
+      serviceEndTime: dateFormatter(new Date(), 'yyyy-MM-dd')
     }
   }
 }
 </script>
-
+<style lang="scss" scoped>
+.cycle-tip {
+  color:#f00;
+  font-size:12px;
+  margin-top:8px;
+  margin-left:5px;
+}
+::v-deep {
+  .ivu-input-number-handler-wrap{
+    display: none;
+  }
+  .service-date-picker{
+    .lines2{
+      margin: 0 5px;
+    }
+    .ivu-date-picker{
+      margin-right:0 !important;
+      width:154px !important;
+    }
+    .ivu-input {
+      width:154px !important;
+      font-size:12px;
+    }
+  }
+}
+</style>
 <style lang="scss">
 .disabled-modal {
 

+ 140 - 0
src/views/order/components/sealDialog.vue

@@ -0,0 +1,140 @@
+<template>
+  <Modal
+      title="盖章记录"
+      v-model="visible"
+      width="500"
+      class-name="seal-model"
+      :mask-closable="false">
+    <Form :model="form" ref="sealFromRef" :rules="ruleValidate" size="middle">
+      <FormItem label="盖章时间:" prop="stamp_time" :label-width="92">
+        <DatePicker type="date" v-model="form.stamp_time" :clear="false" format="yyyy-MM-dd" @on-change="dateChange" placeholder="请选择" style="width:100%;"  />
+      </FormItem>
+      <FormItem label="申请人:" prop="applicant_id"  :label-width="92">
+        <sale-select ref="applySaleRef" :saleType="'1'" @salePerson="salePerson"></sale-select>
+      </FormItem>
+    </Form>
+    <div slot="footer">
+      <Button size="large" @click="visible = false">取消</Button>
+      <Button type="primary" size="large" @click="confirmHandle" :disabled="disabledSubmit" v-loading="loading">确定</Button>
+    </div>
+  </Modal>
+</template>
+
+<script>
+import { dateFormatter } from '@/assets/js/date'
+import saleSelect from './salesSelect.vue'
+
+export default {
+  components: {
+    saleSelect
+  },
+  props: {
+    saleType: String,
+    setDefaultPerson: String,
+    dis: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      visible: false,
+      form: {
+        orderCode: '', // 订单id
+        regType: 'post', // post为新增,delete为删除
+        stamp_time: '',
+        applicant_id: '', // 申请人id
+        salesman_id: '' // 销售人员id
+      },
+      ruleValidate: {
+        stamp_time: [
+          { required: true, message: '盖章时间不能为空', trigger: 'change' },
+          { type: 'date', message: '请输入正确的日期格式', trigger: 'blur' }
+        ],
+        applicant_id: [
+          { required: true, message: '申请人不能为空', trigger: 'change' },
+        ],
+      },
+      loading: false
+    }
+  },
+  computed: {
+    disabledSubmit () {
+      return !this.form.applicant_id || !this.form.stamp_time
+    }
+  },
+  created() {
+    this.form.stamp_time = dateFormatter(new Date(), 'yyyy-MM-dd')
+  },
+  methods: {
+    dateFormatter,
+    show (detailInfo) {
+      if(!detailInfo) {
+        return
+      }
+      this.form.orderCode = detailInfo.order_code
+      const userId = this.$store.getters.getAdminUser?.id || ''
+      this.form.salesman_id = userId
+      //回显销售人员到申请人
+      this.$nextTick(() => {
+        this.$refs.applySaleRef.salePerson = ''
+        if (detailInfo.salesperson && detailInfo.salesperson_id) {
+          let sarr = []
+          let sidarr = detailInfo.salesperson_id.split(',')
+          let saarr = detailInfo.salesperson.split(',')
+          for (let i = 0; i < saarr.length; i++) {
+            sarr.push(JSON.stringify({
+              id: Number(sidarr[i]),
+              username: saarr[i]
+            }))
+          }
+          this.$refs.applySaleRef.salePerson = sarr
+        }
+      })
+      this.visible = true
+    },
+    salePerson (personData) {
+      if(personData) {
+        const pData = []
+        personData.forEach(v => {
+          pData.push(JSON.parse(v))
+        })
+        this.form.applicant_id = pData.map(item => {
+          return item.id
+        }).join()
+      }
+    },
+    dateChange (val) {
+      this.form.stamp_time = val
+    },
+    confirmHandle () {
+      this.loading = true
+      this.$request('/order/orderSeal').data (this.form)
+        .success((res) => {
+          if(res.data.code === 0){
+            this.$Message.success({content: '提交成功'})
+            this.$parent.ordered()
+            this.visible = false
+          }
+          this.loading = false
+        }).error (() => {
+        this.loading = false
+      }).post()
+    },
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+::v-deep {
+  .seal-model{
+    .ivu-modal .ivu-modal-body{
+      height:200px !important;
+    }
+    .ivu-modal-footer{
+      text-align: center;
+    }
+  }
+}
+
+</style>

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

@@ -25,8 +25,8 @@
             <Button type="primary" @click="scanCodeVote(3)" class="create-order">录入线下发票链接/物流信息</Button>
             <Button type="primary" @click="importInvoiced" class="create-order">导入发票</Button>
             <Button type="primary" @click="batchCollected" class="create-order">批量回款</Button>
-            <Button type="primary" @click="otherCreated" class="create-order">创建其他订单</Button>
-            <Button type="primary" @click="orderCreated" class="create-order">创建大会员订单</Button>
+            <!-- <Button type="primary" @click="otherCreated" class="create-order">创建其他订单</Button>
+            <Button type="primary" @click="orderCreated" class="create-order">创建大会员订单</Button> -->
             <Input suffix="md-search" type="text" v-model.trim="sear.keyword" placeholder="搜索订单编号" clearable
                    class="ser-ipt"/>
           </div>

+ 1 - 0
src/views/order/orderReview.vue

@@ -35,6 +35,7 @@
         <Select placeholder="审核状态" clearable v-model="filter.auditStatus" style="width:100px;margin:0 10px 10px 0">
           <Option v-for="item in auditStatus" :value="item.v" :key="item.v">{{ item.n }}</Option>
         </Select>
+        <span style="margin-top: 7px;">业绩归属部门:</span>
         <cascaderMulti class="truecascader" placeholder="业绩归属部门" v-model="saleCodeModel" :data="saleDeplist" multiple @on-change="saleDepChange" style="marginRight:10px;"></cascaderMulti>
       </template>
       <Table

部分文件因文件數量過多而無法顯示