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

Merge branch 'lin_增值服务' into feature/消息提示

# Conflicts:
#	src/views/setting/notification/announcement/index.vue
#	src/views/valueAddedService/orderSettleManag/index.vue
pengyh пре 1 година
родитељ
комит
3d5ebcc665
39 измењених фајлова са 4615 додато и 1596 уклоњено
  1. 3 3
      package-lock.json
  2. 1 1
      package.json
  3. 25 0
      src/api/announcement.js
  4. 86 0
      src/api/orderSettleManag.js
  5. 25 0
      src/api/workOrderPool.js
  6. 9 9
      src/components/Shortcut/index.vue
  7. 7 0
      src/components/template/operation_mixin.js
  8. 25 4
      src/layout/components/AppMain.vue
  9. 3 2
      src/layout/components/TagsView/index.vue
  10. 2 2
      src/permission.js
  11. 2 2
      src/styles/index.scss
  12. 1 1
      src/views/auxiliaryFittings/purchasingManagement/mixins/form_tpl.js
  13. 188 173
      src/views/setting/account/index.vue
  14. 337 311
      src/views/setting/dataDictionary/index.vue
  15. 144 126
      src/views/setting/departmentManage/index.vue
  16. 115 52
      src/views/setting/notification/announcement/index.vue
  17. 53 38
      src/views/setting/notification/systemMessage/index.vue
  18. 116 112
      src/views/setting/role/index.vue
  19. 181 172
      src/views/userManagement/masterManagement/index.vue
  20. 41 105
      src/views/valueAddedService/orderBranchAccount/index.vue
  21. 73 0
      src/views/valueAddedService/orderBranchAccount/pages/collect.vue
  22. 88 0
      src/views/valueAddedService/orderBranchAccount/pages/offline.vue
  23. 56 0
      src/views/valueAddedService/orderMasterSplitAccount/index.vue
  24. 73 0
      src/views/valueAddedService/orderMasterSplitAccount/pages/collect.vue
  25. 88 0
      src/views/valueAddedService/orderMasterSplitAccount/pages/offline.vue
  26. 25 462
      src/views/valueAddedService/orderSettleManag/index.vue
  27. 293 0
      src/views/valueAddedService/orderSettleManag/mixins/basicInfo.js
  28. 44 0
      src/views/valueAddedService/orderSettleManag/mixins/examineInfo.js
  29. 244 0
      src/views/valueAddedService/orderSettleManag/mixins/formItems.js
  30. 151 0
      src/views/valueAddedService/orderSettleManag/mixins/productInfo.js
  31. 238 0
      src/views/valueAddedService/orderSettleManag/mixins/serviceInfo.js
  32. 264 0
      src/views/valueAddedService/orderSettleManag/pages/collect.vue
  33. 398 0
      src/views/valueAddedService/orderSettleManag/pages/offline.vue
  34. 2 0
      src/views/valueAddedService/valueAddedConfig/index.vue
  35. 1162 0
      src/views/workOrder/completedToBeSettled/index.vue
  36. 1 3
      src/views/workOrder/workOrderPool/detailModule/SettleAccounts/index.vue
  37. 2 2
      src/views/workOrder/workOrderPool/detailModule/workOrderInfo/index.vue
  38. 18 2
      src/views/workOrder/workOrderPool/detailModule/workOrderInfo/mixins/basicInfo.js
  39. 31 14
      src/views/workOrder/workOrderPool/detailModule/workOrderInfo/mixins/dispatchInfo.js

+ 3 - 3
package-lock.json

@@ -4716,9 +4716,9 @@
       "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
     },
     "@zjlib/element-plugins": {
-      "version": "2.13.9",
-      "resolved": "http://121.41.110.30:4873/@zjlib%2felement-plugins/-/element-plugins-2.13.9.tgz",
-      "integrity": "sha512-3OBzQqTFIaV2AYu0KHMWgdSz04bOQSO3UHMJBCx08wXjcBezzrXoODQLdfWBYQDNhE+hpZo3mfxTLcOwbANrzw==",
+      "version": "2.13.13",
+      "resolved": "http://121.41.110.30:4873/@zjlib%2felement-plugins/-/element-plugins-2.13.13.tgz",
+      "integrity": "sha512-9WH9T7kBuKc1IHSUrQ5w7RsDU4yA/Q5u3muvjS893p3J3hR9K3r/dEmcfWXKXsPCROd/+QqNqBsUEvIaiofvIQ==",
       "requires": {
         "@turf/turf": "^6.5.0",
         "@vuemap/vue-amap": "^0.1.12",

+ 1 - 1
package.json

@@ -18,7 +18,7 @@
     "@turf/turf": "^6.5.0",
     "@vue-office/excel": "^1.3.0",
     "@vue/composition-api": "^1.7.1",
-    "@zjlib/element-plugins": "^2.13.9",
+    "@zjlib/element-plugins": "^2.13.13",
     "@zjlib/element-ui2": "^1.0.3",
     "axios": "0.18.1",
     "chatgpt": "^4.1.2",

+ 25 - 0
src/api/announcement.js

@@ -1,5 +1,30 @@
 import request, { postBlob, getBlob, handleImport } from '@/utils/request'
 
+
+export function zfapiNoticeDetail(params) {
+  return request({
+    url: '/notice/detail',
+    method: 'get',
+    params
+  })
+}
+
+export function noticeReadList(data) {
+  return request({
+    url: `/notice/read/list?moduleId=${data.moduleId}`,
+    method: 'post',
+    data
+  })
+}
+
+export function noticeReadListExport(data, name) {
+  return postBlob({
+    url: '/notice/read/list/export',
+    data,
+    name
+  })
+}
+
 // 获取师傅列表
 export function noticeListPageV2(data) {
   return request({

+ 86 - 0
src/api/orderSettleManag.js

@@ -1,5 +1,91 @@
 import request, { postBlob, getBlob, handleImport } from '@/utils/request'
 
+export function increOrderSettleGetBrand(params) {
+  return request({
+    url: '/incre/order/settle/getBrand',
+    method: 'post',
+    params
+  })
+}
+
+export function increOrderSettleGetCategoryList(params) {
+  return request({
+    url: '/incre/order/settle/getCategoryList',
+    method: 'post',
+    params
+  })
+}
+
+export function increOrderSettleGetIncreItem(params) {
+  return request({
+    url: '/incre/order/settle/getIncreItem',
+    method: 'post',
+    params
+  })
+}
+
+export function increOrderSettleGetWebsit(params) {
+  return request({
+    url: '/incre/order/settle/getWebsit',
+    method: 'post',
+    params
+  })
+}
+export function increOrderSettleGeneratePayCode(params) {
+  return request({
+    url: '/incre/order/settle/generate/pay/code',
+    method: 'post',
+    params
+  })
+}
+
+// ----------------
+
+export function increOrderSettleExamine(data) {
+  return request({
+    url: `/incre/order/settle/examine`,
+    method: 'post',
+    data
+  })
+}
+export function increOrderSettleAdd(data) {
+  return request({
+    url: `/incre/order/settle/add`,
+    method: 'post',
+    data
+  })
+}
+export function increOrderSettleList2(data) {
+  return request({
+    url: `/incre/order/settle/list2?moduleId=${data.moduleId}`,
+    method: 'post',
+    data
+  })
+}
+
+export function increOrderSettleCountWorkerList(data) {
+  return request({
+    url: `/incre/order/settle/count/worker/list?moduleId=${data.moduleId}`,
+    method: 'post',
+    data
+  })
+}
+
+export function increOrderSettleListExport2(data, name) {
+  return postBlob({
+    url: '/incre/order/settle/list/export2',
+    data,
+    name
+  })
+}
+export function increOrderSettleCountWorkerListExport(data, name) {
+  return postBlob({
+    url: '/incre/order/settle/count/worker/list/export',
+    data,
+    name
+  })
+}
+
 export function increOrderSettleList(data) {
   return request({
     url: `/incre/order/settle/list?moduleId=${data.moduleId}`,

+ 25 - 0
src/api/workOrderPool.js

@@ -148,6 +148,14 @@ export function orderBaseList(data) {
   })
 }
 
+export function orderBaseList2(data) {
+  return request({
+    url: `/order/base/list2?moduleId=${data.moduleId}`,
+    method: 'post',
+    data
+  })
+}
+
 export function orderBaseListExport(data, name) {
   return postBlob({
     url: '/order/base/list/export',
@@ -164,6 +172,14 @@ export function orderBaseStatusCount(params) {
   })
 }
 
+export function orderBaseStatusCount2(params) {
+  return request({
+    url: `/order/base/status/count2`,
+    method: 'post',
+    params
+  })
+}
+
 export function orderBaseLogList(params) {
   return request({
     url: `/order/base/log/list`,
@@ -211,3 +227,12 @@ export function orderBaseReject(params) {
     params
   })
 }
+
+export function orderBaseSettleNormDetail2(params) {
+  return request({
+    url: `/order/base/settle/norm/detail2`,
+    method: 'post',
+    params
+  })
+}
+

+ 9 - 9
src/components/Shortcut/index.vue

@@ -128,15 +128,15 @@ export default {
     commonCompanywechatGet({ id: this.userInfo.companyWechatId }).then(res => {
       console.log(res)
       this.QRcodeList = []
-      if (res?.data?.qrcode1) {
-        this.QRcodeList.push({
-          codeUrl: res.data.qrcode1,
-          name: "小程序",
-          saleName: "",
-          iosIcon: "https://fw.gd-jxm.com/gateway/pcapi/img/get?key=2023-10/16976801488369080b52c-a1e6-40a0-83f9-8e04f12b494e.jpg",
-          androidIcon: "https://fw.gd-jxm.com/gateway/pcapi/img/get?key=2023-10/1697680143828d678a6e5-307d-47d0-8ee9-1698f100feb4.jpg"
-        })
-      }
+      // if (res?.data?.qrcode1) {
+      //   this.QRcodeList.push({
+      //     codeUrl: res.data.qrcode1,
+      //     name: "小程序",
+      //     saleName: "",
+      //     iosIcon: "https://fw.gd-jxm.com/gateway/pcapi/img/get?key=2023-10/16976801488369080b52c-a1e6-40a0-83f9-8e04f12b494e.jpg",
+      //     androidIcon: "https://fw.gd-jxm.com/gateway/pcapi/img/get?key=2023-10/1697680143828d678a6e5-307d-47d0-8ee9-1698f100feb4.jpg"
+      //   })
+      // }
       if (res?.data?.qrcode2) {
         this.QRcodeList.push({
           codeUrl: res.data.qrcode2,

+ 7 - 0
src/components/template/operation_mixin.js

@@ -19,6 +19,13 @@ function hasCommonElements(arr1, arr2) {
 }
 
 export default {
+  data(){
+    return {
+      pageType:this.$route.params.pageType,
+      pageCode:this.$route.params.pageCode,
+      pagePam:this.$route.params.pagePam
+    }
+  },
   methods: {
     optionsEvensAuth(key, obj) {
       var roleItems = this.$route.meta.roleItems

+ 25 - 4
src/layout/components/AppMain.vue

@@ -16,7 +16,8 @@ export default {
   name: 'AppMain',
   data() {
     return {
-      key: 0
+      key: 0,
+      nameKey:""
     }
   },
   computed: {
@@ -24,11 +25,31 @@ export default {
     str() {
       return this.$store.state?.user?.name
     },
-    nameKey() {
-      return this.$store.state.tagsView.visitedViews.find(item => item?.name === this.$route?.name)?.nameKey || Math.floor(Date.now() / 1000) + ""
+  },
+  watch: {
+    $route(val, oval) {
+      this.setNameKey()
     },
   },
-
+  created(){
+    this.setNameKey()
+  },
+  methods:{
+    setNameKey(){
+      var { name,params } = this.$route
+      var {pageType,pageCode,pagePam} =params
+      var item = this.$store.state.tagsView.visitedViews.find(item => {
+        return !!~item?.nameKey.indexOf(`${name}_${pageType}_${pageCode}_${pagePam}`)
+      })
+      if(!item){
+        setTimeout(()=>{
+          this.setNameKey()
+        },50)
+      }else{
+        this.nameKey = item.nameKey
+      }
+    }
+  }
 }
 </script>
 

+ 3 - 2
src/layout/components/TagsView/index.vue

@@ -111,9 +111,10 @@ export default {
       }
     },
     addTags() {
-      const { name } = this.$route
+      const { name,params } = this.$route
+      const {pageType,pageCode,pagePam} =params
       if (name) {
-        this.$store.dispatch('tagsView/addView', {...this.$route, nameKey:`${this.$route.name}_${Math.floor(Date.now() / 1000)}`})
+        this.$store.dispatch('tagsView/addView', {...this.$route, nameKey:`${name}_${pageType}_${pageCode}_${pagePam}_${Math.floor(Date.now() / 1000)}`})
       }
       return false
     },

+ 2 - 2
src/permission.js

@@ -159,7 +159,7 @@ function buildRoute(route, parentUrl = '', bool = true) {
       item.meta.roleItems = roleItems
 
       if (!pages.find(ite => ite.path === item.path)) {
-        item.path = `${item.path}${bool ? '' : ''}`
+        item.path = `${item.path}${bool?'/:pageType?/:pageCode?/:pagePam?':''}`
         pages.push(item)
       }
 
@@ -181,7 +181,7 @@ function buildRoute(route, parentUrl = '', bool = true) {
         item.component = _import(`${fullUrl}/index`)
         item.component.name = item.name
         if (!pages.find(ite => ite.path === item.path)) {
-          item.path = `${item.path}${bool ? '' : ''}`
+          item.path = `${item.path}${bool?'/:pageType?/:pageCode?/:pagePam?':''}`
           pages.push(item)
         }
 

+ 2 - 2
src/styles/index.scss

@@ -162,8 +162,8 @@ div:focus {
 
 // 主要内容区域样式
 .mymain-container {
-  margin-top: 15px;
-  margin-bottom: 20px;
+  // margin-top: 15px;
+  // margin-bottom: 20px;
   .btn-group {
     .text {
       font-size: 16px;

+ 1 - 1
src/views/auxiliaryFittings/purchasingManagement/mixins/form_tpl.js

@@ -721,7 +721,7 @@ export default {
                 </el-descriptions>
                 <el-descriptions border title="" column={4} colon={false} labelStyle={{ width: '8%' }} contentStyle={{ width: '17%' }} style="margin-top:-1px">
                   <el-descriptions-item label="附件">
-                    <ImageUpload fileList={this.formData.imageUrl} uid="imgSrc666_materials_drawing_images" limit={1} isEdit={this.formDialogType < 2} />
+                    <ImageUpload fileList={this.formData.imageUrl} uid="imgSrc666_materials_drawing_images" limit={1} isEdit={this.formDialogType < 2} fileType={["image"]} />
                   </el-descriptions-item>
                   <el-descriptions-item label="备注" contentStyle={{ width: '67%' }}>
                     <el-input

+ 188 - 173
src/views/setting/account/index.vue

@@ -1,149 +1,149 @@
 <template>
-  <div class="app-container">
-    <div class="setting_title">账户管理</div>
-    <el-divider></el-divider>
-
-    <div class="mymain-container">
-      <div class="btn-group clearfix">
-        <div class="fl">
-          <el-button size="small" type="primary" icon="el-icon-plus" @click="addOrEdit('add')">新增账户</el-button>
-        </div>
-        <div class="fr">
-          <el-select v-model="screenForm.role" placeholder="全部" size="small" style="width: 120px; margin-right: 10px;"
-            @change="getListByScreen">
-            <el-option label="全部角色" value=""></el-option>
-            <el-option :label="item.name" :value="item.adminRoleId" v-for="(item, index) in roleList"
-              :key="index"></el-option>
-          </el-select>
-          <el-select v-model="screenForm.status" placeholder="全部" size="small" style="width: 120px; margin-right: 10px;"
-            @change="getListByScreen">
-            <el-option label="全部状态" value=""></el-option>
-            <el-option :label="item.label" :value="item.value" v-for="(item, index) in select_status"
-              :key="index"></el-option>
-          </el-select>
-          <el-input placeholder="请输入内容" v-model="screenForm.keyword" size="small" style="width: 180px;">
-            <el-button slot="append" icon="el-icon-search" size="small" @click="getListByScreen"></el-button>
-          </el-input>
+  <zj-tab-page ref="tabPage" :defaultActives="[{ key: 'list', label: '列表页面', essential: true }]">
+    <template slot-scope="{activeKey, data}">
+      <div :style="{
+        width: '100%',
+        height: activeKey == 'list' ? '100%' : '0px',
+        overflow: 'hidden'
+      }">
+        <div class="app-container">
+          <div class="setting_title">账户管理</div>
+          <el-divider></el-divider>
+          <div class="mymain-container">
+            <div class="btn-group clearfix">
+              <div class="fl">
+                <el-button size="small" type="primary" icon="el-icon-plus" @click="addOrEdit('add')">新增账户</el-button>
+              </div>
+              <div class="fr">
+                <el-select v-model="screenForm.role" placeholder="全部" size="small"
+                  style="width: 120px; margin-right: 10px;" @change="getListByScreen">
+                  <el-option label="全部角色" value=""></el-option>
+                  <el-option :label="item.name" :value="item.adminRoleId" v-for="(item, index) in roleList"
+                    :key="index"></el-option>
+                </el-select>
+                <el-select v-model="screenForm.status" placeholder="全部" size="small"
+                  style="width: 120px; margin-right: 10px;" @change="getListByScreen">
+                  <el-option label="全部状态" value=""></el-option>
+                  <el-option :label="item.label" :value="item.value" v-for="(item, index) in select_status"
+                    :key="index"></el-option>
+                </el-select>
+                <el-input placeholder="请输入内容" v-model="screenForm.keyword" size="small" style="width: 180px;">
+                  <el-button slot="append" icon="el-icon-search" size="small" @click="getListByScreen"></el-button>
+                </el-input>
+              </div>
+            </div>
+            <div class="table">
+              <el-table v-loading="listLoading" :data="dataList" element-loading-text="Loading" border fit
+                highlight-current-row stripe>
+                <el-table-column align="center" label="序号" type="index" width="50"></el-table-column>
+                <el-table-column align="center" label="账号" prop="userName" min-width="120"></el-table-column>
+                <el-table-column align="center" label="用户名" prop="nickName" min-width="120"></el-table-column>
+                <el-table-column align="center" label="角色" prop="roleName" min-width="100"></el-table-column>
+                <el-table-column align="center" label="创建时间" prop="createTime" min-width="160"></el-table-column>
+                <el-table-column align="center" label="最后登录时间" prop="lastLoginTime" min-width="160"></el-table-column>
+                <el-table-column align="center" label="状态" class-name="status-col">
+                  <template slot-scope="scope">
+                    <el-tag :type="scope.row.status ? 'success' : 'danger'">{{ scope.row.status ? '正常' : '冻结' }}</el-tag>
+                  </template>
+                </el-table-column>
+                <el-table-column align="center" label="操作" min-width="160">
+                  <template slot-scope="scope">
+                    <el-popconfirm v-if="scope.row.status" style="margin-right: 10px;" title="确定冻结吗?"
+                      @confirm="changeStatus(scope.row.adminUserId, 0)">
+                      <el-button slot="reference" type="text">冻结</el-button>
+                    </el-popconfirm>
+                    <el-popconfirm v-else style="margin-right: 10px;" title="确定恢复吗?"
+                      @confirm="changeStatus(scope.row.adminUserId, 1)">
+                      <el-button slot="reference" type="text">恢复</el-button>
+                    </el-popconfirm>
+                    <el-button type="text" @click="addOrEdit('edit', scope.row.adminUserId)">编辑</el-button>
+                    <el-button type="text" @click="handleReset(scope.row.adminUserId)">重置密码</el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+            <div class="pagination clearfix">
+              <div class="fr">
+                <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
+                  :current-page="currentPage" :page-sizes="[10, 20, 30, 50]" :page-size="10"
+                  layout="total, sizes, prev, pager, next, jumper" :total="listTotal">
+                </el-pagination>
+              </div>
+            </div>
+          </div>
         </div>
       </div>
-
-      <div class="table">
-        <el-table v-loading="listLoading" :data="dataList" element-loading-text="Loading" border fit highlight-current-row
-          stripe>
-          <el-table-column align="center" label="序号" type="index" width="50"></el-table-column>
-          <el-table-column align="center" label="账号" prop="userName" min-width="120"></el-table-column>
-          <el-table-column align="center" label="用户名" prop="nickName" min-width="120"></el-table-column>
-          <el-table-column align="center" label="角色" prop="roleName" min-width="100"></el-table-column>
-          <el-table-column align="center" label="创建时间" prop="createTime" min-width="160"></el-table-column>
-          <el-table-column align="center" label="最后登录时间" prop="lastLoginTime" min-width="160"></el-table-column>
-          <el-table-column align="center" label="状态" class-name="status-col">
-            <template slot-scope="scope">
-              <el-tag :type="scope.row.status ? 'success' : 'danger'">{{ scope.row.status ? '正常' : '冻结' }}</el-tag>
-            </template>
-          </el-table-column>
-          <el-table-column align="center" label="操作" min-width="160">
-            <template slot-scope="scope">
-              <el-popconfirm v-if="scope.row.status" style="margin-right: 10px;" title="确定冻结吗?"
-                @confirm="changeStatus(scope.row.adminUserId, 0)">
-                <el-button slot="reference" type="text">冻结</el-button>
-              </el-popconfirm>
-              <el-popconfirm v-else style="margin-right: 10px;" title="确定恢复吗?"
-                @confirm="changeStatus(scope.row.adminUserId, 1)">
-                <el-button slot="reference" type="text">恢复</el-button>
-              </el-popconfirm>
-
-              <el-button type="text" @click="addOrEdit('edit', scope.row.adminUserId)">编辑</el-button>
-              <el-button type="text" @click="handleReset(scope.row.adminUserId)">重置密码</el-button>
-            </template>
-          </el-table-column>
-        </el-table>
-      </div>
-
-      <div class="pagination clearfix">
-        <div class="fr">
-          <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="currentPage"
-            :page-sizes="[10, 20, 30, 50]" :page-size="10" layout="total, sizes, prev, pager, next, jumper"
-            :total="listTotal">
-          </el-pagination>
+      <div v-if="~['add', 'edit'].indexOf(activeKey)" style="box-sizing: border-box;padding: 16px;">
+        <el-form ref="addForm" :model="addForm" :rules="addFormRules" label-position="left" label-width="120px">
+          <el-form-item label="账号" prop="account">
+            <el-input v-model="addForm.account" autocomplete="off" placeholder="请输入账号"></el-input>
+          </el-form-item>
+          <el-form-item label="用户名" prop="nickName">
+            <el-input v-model="addForm.nickName" autocomplete="off" placeholder="请输入用户名"></el-input>
+          </el-form-item>
+          <el-form-item label="手机号" prop="linkPhone">
+            <el-input v-model="addForm.linkPhone" autocomplete="off" placeholder="请输入手机号"></el-input>
+          </el-form-item>
+          <el-form-item label="角色组" prop="role">
+            <el-select v-model="addForm.role" placeholder="请选择角色组" style="width: 100%;">
+              <el-option :label="item.name" :value="item.adminRoleId" v-for="(item, index) in roleList"
+                :key="index"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="网点" prop="adminWebsitId">
+            <el-cascader style="width: 100%" :options="departmentList"
+              :props="{ checkStrictly: true, value: 'websitId', label: 'name' }" v-model="addForm.adminWebsitId"
+              clearable>
+            </el-cascader>
+          </el-form-item>
+          <el-form-item label="密码" prop="newPassword">
+            <el-input v-model="addForm.newPassword" ref="password1" autocomplete="off" placeholder="请输入密码"
+              :type="passwordType1"></el-input>
+            <span class="show-pwd" @click="showPwd(1)">
+              <svg-icon :icon-class="passwordType1 === 'password' ? 'eye' : 'eye-open'" />
+            </span>
+          </el-form-item>
+          <el-form-item label="确认密码" prop="confirmPassword">
+            <el-input v-model="addForm.confirmPassword" ref="password2" autocomplete="off" placeholder="请再次输入密码"
+              :type="passwordType2"></el-input>
+            <span class="show-pwd" @click="showPwd(2)">
+              <svg-icon :icon-class="passwordType2 === 'password' ? 'eye' : 'eye-open'" />
+            </span>
+          </el-form-item>
+          <el-form-item label="是否公众号通知" prop="pubNotice">
+            <el-switch v-model="addForm.pubNotice" active-color="#13ce66" inactive-color="#ff4949">
+            </el-switch>
+          </el-form-item>
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+          <el-button @click="data.removeTab()">取 消</el-button>
+          <el-button type="primary" @click="submitAddForm(data.removeTab)">确 定</el-button>
         </div>
       </div>
-    </div>
-
-    <!-- 重置密码 -->
-    <el-dialog title="重置密码" :visible.sync="resetFormVisible" :show-close="false" width="40%"
-      :close-on-click-modal="false">
-      <el-form ref="resetForm" :model="resetForm" :rules="resetFormRules" label-position="left" label-width="100px">
-        <el-form-item label="输入新密码" prop="newPassword">
-          <el-input v-model="resetForm.newPassword" ref="password1" autocomplete="off" placeholder="请输入新密码"
-            :type="passwordType1"></el-input>
-          <span class="show-pwd" @click="showPwd(1)">
-            <svg-icon :icon-class="passwordType1 === 'password' ? 'eye' : 'eye-open'" />
-          </span>
-        </el-form-item>
-        <el-form-item label="确认密码" prop="confirmPassword">
-          <el-input v-model="resetForm.confirmPassword" ref="password2" autocomplete="off" placeholder="请再次输入新密码"
-            :type="passwordType2"></el-input>
-          <span class="show-pwd" @click="showPwd(2)">
-            <svg-icon :icon-class="passwordType2 === 'password' ? 'eye' : 'eye-open'" />
-          </span>
-        </el-form-item>
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button @click="cancelResetForm">取 消</el-button>
-        <el-button type="primary" @click="submitResetForm">确 定</el-button>
-      </div>
-    </el-dialog>
-
-    <!-- 新增编辑账户 -->
-    <el-dialog :title="addFormType == 'add' ? '新增账户' : '编辑账户'" :visible.sync="addFormVisible" :show-close="false"
-      width="500px" :close-on-click-modal="false">
-      <el-form ref="addForm" :model="addForm" :rules="addFormRules" label-position="left" label-width="120px">
-        <el-form-item label="账号" prop="account">
-          <el-input v-model="addForm.account" autocomplete="off" placeholder="请输入账号"></el-input>
-        </el-form-item>
-        <el-form-item label="用户名" prop="nickName">
-          <el-input v-model="addForm.nickName" autocomplete="off" placeholder="请输入用户名"></el-input>
-        </el-form-item>
-        <el-form-item label="手机号" prop="linkPhone">
-          <el-input v-model="addForm.linkPhone" autocomplete="off" placeholder="请输入手机号"></el-input>
-        </el-form-item>
-        <el-form-item label="角色组" prop="role">
-          <el-select v-model="addForm.role" placeholder="请选择角色组" style="width: 100%;">
-            <el-option :label="item.name" :value="item.adminRoleId" v-for="(item, index) in roleList"
-              :key="index"></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="网点" prop="adminWebsitId">
-          <el-cascader style="width: 100%" :options="departmentList"
-            :props="{ checkStrictly: true, value: 'websitId', label: 'name' }" v-model="addForm.adminWebsitId" clearable>
-          </el-cascader>
-        </el-form-item>
-        <el-form-item label="密码" prop="newPassword">
-          <el-input v-model="addForm.newPassword" ref="password1" autocomplete="off" placeholder="请输入密码"
-            :type="passwordType1"></el-input>
-          <span class="show-pwd" @click="showPwd(1)">
-            <svg-icon :icon-class="passwordType1 === 'password' ? 'eye' : 'eye-open'" />
-          </span>
-        </el-form-item>
-        <el-form-item label="确认密码" prop="confirmPassword">
-          <el-input v-model="addForm.confirmPassword" ref="password2" autocomplete="off" placeholder="请再次输入密码"
-            :type="passwordType2"></el-input>
-          <span class="show-pwd" @click="showPwd(2)">
-            <svg-icon :icon-class="passwordType2 === 'password' ? 'eye' : 'eye-open'" />
-          </span>
-        </el-form-item>
-        <el-form-item label="是否公众号通知" prop="pubNotice">
-          <el-switch v-model="addForm.pubNotice" active-color="#13ce66" inactive-color="#ff4949">
-          </el-switch>
-        </el-form-item>
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button @click="cancelAddForm">取 消</el-button>
-        <el-button type="primary" @click="submitAddForm">确 定</el-button>
+      <div v-if="~['resetpassword'].indexOf(activeKey)" style="box-sizing: border-box;padding: 16px;">
+        <el-form ref="resetForm" :model="resetForm" :rules="resetFormRules" label-position="left" label-width="100px">
+          <el-form-item label="输入新密码" prop="newPassword">
+            <el-input v-model="resetForm.newPassword" ref="password1" autocomplete="off" placeholder="请输入新密码"
+              :type="passwordType1"></el-input>
+            <span class="show-pwd" @click="showPwd(1)">
+              <svg-icon :icon-class="passwordType1 === 'password' ? 'eye' : 'eye-open'" />
+            </span>
+          </el-form-item>
+          <el-form-item label="确认密码" prop="confirmPassword">
+            <el-input v-model="resetForm.confirmPassword" ref="password2" autocomplete="off" placeholder="请再次输入新密码"
+              :type="passwordType2"></el-input>
+            <span class="show-pwd" @click="showPwd(2)">
+              <svg-icon :icon-class="passwordType2 === 'password' ? 'eye' : 'eye-open'" />
+            </span>
+          </el-form-item>
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+          <el-button @click="data.removeTab()">取 消</el-button>
+          <el-button type="primary" @click="submitResetForm(data.removeTab)">确 定</el-button>
+        </div>
       </div>
-    </el-dialog>
-
-  </div>
+    </template>
+  </zj-tab-page>
 </template>
 
 <script>
@@ -216,9 +216,7 @@ export default {
         children: 'children',
       },
       merchantList: [], // 商户列表
-
       resetId: null,
-      resetFormVisible: false,
       resetForm: {
         newPassword: '', // 新密码
         confirmPassword: '', // 确认密码
@@ -231,10 +229,8 @@ export default {
           { required: true, validator: validatePass2, trigger: 'blur' }
         ],
       },
-
       editId: null,
       addFormType: 'add',
-      addFormVisible: false,
       addForm: {
         account: '', // 账号
         nickName: '', // 用户名
@@ -243,7 +239,7 @@ export default {
         newPassword: '', // 新密码
         confirmPassword: '', // 确认密码
         pubNotice: true,
-        linkPhone:"",
+        linkPhone: "",
       },
       addFormRules: {
         account: [
@@ -268,7 +264,6 @@ export default {
           { required: true, validator: validatePass4, trigger: 'blur' }
         ],
       },
-
       passwordType1: 'password',
       passwordType2: 'password',
     }
@@ -394,20 +389,31 @@ export default {
 
     // 重置密码
     handleReset(id) {
-      this.resetId = id;
-      this.resetFormVisible = true;
+      this.$refs.tabPage.addTab({
+				activeKey: "resetpassword",
+				key: "resetpassword",
+				label: "重置密码",
+				triggerEvent: () => {
+					this.cancelResetForm()
+					this.$nextTick(() => {
+						this.resetId = id;
+					})
+				},
+				closeEvent: () => {
+          this.cancelResetForm()
+				}
+			})
     },
 
     // 取消重置密码
     cancelResetForm() {
-      this.resetFormVisible = false;
       this.passwordType1 = 'password';
       this.passwordType2 = 'password';
-      this.$refs.resetForm.resetFields();
+      this.$refs?.resetForm?.resetFields();
     },
 
     // 提交重置密码
-    submitResetForm() {
+    submitResetForm(removeTab) {
       this.$refs.resetForm.validate((valid) => {
         if (valid) {
           let params = {
@@ -415,7 +421,7 @@ export default {
             adminUserId: this.resetId
           }
           resetPassword(params).then(res => {
-            this.cancelResetForm();
+            removeTab('list');
             this.getList();
             this.$successMsg();
           })
@@ -425,35 +431,44 @@ export default {
 
     // 新增编辑 账户
     async addOrEdit(type, id) {
-      this.addFormType = type;
-      this.addFormVisible = true;
-      this.departmentList = await this.getDepartmentList();
-
-      if (type == 'edit') {
-        this.editId = id;
-        getUserInfo({ adminUserId: id }).then(res => {
-          this.addForm = {
-            account: res.data.userName,
-            role: res.data.roleId,
-            nickName: res.data.nickName,
-            pubNotice: res.data.pubNotice,
-            adminWebsitId: res.data.adminWebsitId,
-            linkPhone: res.data.linkPhone
+      this.$refs.tabPage.addTab({
+				activeKey: type,
+        key: type,
+        label: ({ add: "新增", edit: "编辑" })[type],
+				triggerEvent: async () => {
+          this.cancelAddForm()
+					this.addFormType = type;
+          this.departmentList = await this.getDepartmentList();
+          if (type == 'edit') {
+            this.editId = id;
+            getUserInfo({ adminUserId: id }).then(res => {
+              this.addForm = {
+                account: res.data.userName,
+                role: res.data.roleId,
+                nickName: res.data.nickName,
+                pubNotice: res.data.pubNotice,
+                adminWebsitId: res.data.adminWebsitId,
+                linkPhone: res.data.linkPhone
+              }
+            })
           }
-        })
-      }
+				},
+				closeEvent: () => {
+          
+				}
+			})
     },
 
     // 取消 新增编辑账户
     cancelAddForm() {
-      this.addFormVisible = false;
       this.passwordType1 = 'password';
       this.passwordType2 = 'password';
-      this.$refs.addForm.resetFields();
+      this.$refs?.addForm?.resetFields();
+      this.$data.addForm = this.$options.data().addForm
     },
 
     // 提交 新增编辑账户
-    submitAddForm() {
+    submitAddForm(removeTab) {
       this.$refs.addForm.validate((valid) => {
         if (valid) {
           let adminWebsitId = null
@@ -474,13 +489,13 @@ export default {
           if (this.addFormType == 'edit') {
             params.adminUserId = this.editId;
             editAccount(params).then(res => {
-              this.cancelAddForm();
+              removeTab('list');
               this.getList();
               this.$successMsg('编辑成功');
             })
           } else {
             addAccount(params).then(res => {
-              this.cancelAddForm();
+              removeTab('list');
               this.getList();
               this.$successMsg('新增成功');
             })

+ 337 - 311
src/views/setting/dataDictionary/index.vue

@@ -1,43 +1,42 @@
 <template>
-  <!-- :exportList="exportList" -->
-	<zj-page-container direction="row">
-		 <div class="catalogue">
-			 <div class="title">类型名称</div>
-		     <zj-page-container>
-		         <zj-page-fill>
-		             <el-tree :data="typeList" :props="defaultProps" default-expand-all :highlight-current="true"
-		                 :expand-on-click-node="false" @node-click="handleNodeClick" current-node-key="ASSIST_UNIT"
-		                 node-key="dictType" ref="listTree"> 
-		             </el-tree>
-		         </zj-page-fill>
-		     </zj-page-container>
-		 </div>
-		 <template-page ref="pageRef" :getList="getList" :columnParsing="columnParsing" :optionsEvensGroup="optionsEvensGroup"
-		   :tableAttributes="tableAttributes" :tableEvents="tableEvents" :operationColumnWidth="160" :operation="operation()" :exportList="exportList">
-		   <!-- <AddDataDictionary :visible="visible" :item="item" @setVisible="bool => {
-		     visible = bool
-		     if (!bool && item) {
-		       item = null
-		     }
-		   }
-		     " @success="() => {
-		   $refs.pageRef.refreshList()
-		 }
-		   " /> -->
-		   <el-dialog title="" width="500px" custom-class="diy-dialog" append-to-body :modal="true" :visible.sync="formDialog"
-		     :show-close="true" :close-on-click-modal="false" :modal-append-to-body="false" :before-close="formCancel">
-		     <zj-form-container ref="formRef" :form-data="formData" :styleSwitch="false">
-		       <zj-form-module :title="formDialogTitles[formDialogType]" label-width="100px" :showPackUp="false"
-		         :form-data="formData" :form-items="formItems" :disabled="formDialogType==2">
-		       </zj-form-module>
-		     </zj-form-container>
-		     <div slot="footer" class="dialog-footer">
-		   			<el-button size="mini" @click="formCancel">取 消</el-button>
-		   			<el-button size="mini" type="primary" @click="formConfirm()">确定</el-button>
-		     </div>
-		   </el-dialog>
-		 </template-page>
-	</zj-page-container>
+	<zj-tab-page ref="tabPage" :defaultActives="[{ key: 'list', label: '列表页面', essential: true }]">
+		<template slot-scope="{activeKey, data}">
+			<div :style="{
+				width: '100%',
+				height: activeKey == 'list' ? '100%' : '0px',
+				overflow: 'hidden'
+			}">
+				<zj-page-container direction="row">
+					<div class="catalogue">
+						<div class="title">类型名称</div>
+						<zj-page-container>
+							<zj-page-fill>
+								<el-tree :data="typeList" :props="defaultProps" default-expand-all :highlight-current="true"
+									:expand-on-click-node="false" @node-click="handleNodeClick" current-node-key="ASSIST_UNIT"
+									node-key="dictType" ref="listTree">
+								</el-tree>
+							</zj-page-fill>
+						</zj-page-container>
+					</div>
+					<template-page ref="pageRef" :getList="getList" :columnParsing="columnParsing"
+						:optionsEvensGroup="optionsEvensGroup" :tableAttributes="tableAttributes" :tableEvents="tableEvents"
+						:operationColumnWidth="160" :operation="operation()" :exportList="exportList">
+					</template-page>
+				</zj-page-container>
+			</div>
+			<div v-if="~['add', 'detail'].indexOf(activeKey)" style="box-sizing: border-box;padding: 16px;">
+				<zj-form-container ref="formRef" :form-data="formData" :styleSwitch="false">
+					<zj-form-module :title="data.label" label-width="100px" :showPackUp="false" :form-data="formData"
+						:form-items="formItems" :disabled="formDialogType == 2">
+					</zj-form-module>
+				</zj-form-container>
+				<div slot="footer" class="dialog-footer">
+					<el-button size="mini" @click="data.removeTab()">取 消</el-button>
+					<el-button size="mini" type="primary" @click="formConfirm(data.removeTab)">确定</el-button>
+				</div>
+			</div>
+		</template>
+	</zj-tab-page>
 </template>
 
 <script>
@@ -48,284 +47,311 @@ import { required } from '@/components/template/rules_verify.js'
 import { commonTemplateDownload } from '@/api/common.js'
 import { getType, getDataDictionaryExport, getDataDictionary, add, edit, del, getDetail, listImport } from '@/api/dataDictionary.js'
 export default {
-  components: {
-    TemplatePage,
-    AddDataDictionary
-  },
-  mixins: [import_mixin],
-  data() {
-    return {
-      // 事件组合
-      optionsEvensGroup: [
-        [
-          [
-            {
-              name: '新增',
-              click: this.addData
-            }
-          ]
-        ],
-		[
-          [
-            {
-              name: '下载导入模板',
-              click: this.handleDownload
-            }
-          ],
-          [
-            {
-              name: '导入模板',
-              render: () => {
-                return this.importButton(listImport, '导入模板')
-              }
-            }
-          ],
-        ]
-      ],
-      // 表格属性
-      tableAttributes: {},
-      // 表格事件
-      tableEvents: {},
-      visible: false,
-      item: null,
-	  dictType: 'ASSIST_UNIT',
-	  dictTypeName: '辅材单位',
-	  typeList: [],
-	  defaultProps: {
-	    children: '',
-	    label: 'remark'
-	  },
-	  /** 表单变量 */
-	  formDialogType: 0,
-	  formDialogTitles: ["新增","编辑", "详情"],
-	  formDialog: false,
-	  formData: {
-	  	companyName: JSON.parse(localStorage.getItem('greemall_user')).companyName,
-		dictType: 'ASSIST_UNIT',
-		dictTypeName: '辅材单位',
-		dictValue: '',
-		status: 'ON',
-		sortNum: '',
-		remark: ''
-	  }
-    }
-  },
-  created() {
-  	this.getType()
-  },
-  computed: {
-	  formItems() {
-	      return [{
-	        md: 24,
-	        isShow: true,
-	        name: 'el-input',
-	        attributes: { placeholder: '请输入', disabled: true },
-	        formItemAttributes: {
-	          label: '所属商户',
-	          prop: 'companyName',
-	          rules: [...required]
-	        },
-	      }, {
-	        md: 24,
-	        isShow: true,
-	        name: 'el-input',
-	        attributes: { placeholder: '请输入', disabled: true },
-	        formItemAttributes: {
-	          label: '类型名称',
-	          prop: 'dictTypeName',
-	          rules: [...required]
-	        },
-	      }, {
-	        md: 24,
-	        isShow: true,
-	        name: 'el-input',
-	        attributes: { placeholder: '请输入' },
-	        formItemAttributes: {
-	          label: '字典值',
-	          prop: 'dictValue',
-	          rules: [...required]
-	        },
-	      }, {
-	        md: 24,
-	        isShow: true,
-	        name: 'slot-component',
-	        attributes: { },
-	        formItemAttributes: {
-	          label: '状态',
-	          prop: 'status',
-	          rules: [...required]
-	        },
-	    	render: (h, { props, onInput }) => {
-	    		var { value } = props
-	    		return (
-	    			<el-radio-group v-model={this.formData.status}>
-	    			    <el-radio disabled={this.formDialogType==2} label="ON">启用</el-radio>
-	    			    <el-radio disabled={this.formDialogType==2} label="OFF">禁用</el-radio>
-	    			</el-radio-group>
-	    		)
-	    	}
-		},{
-	        md: 24,
-	        isShow: true,
-	        name: 'el-input',
-	        attributes: { placeholder: '请输入' },
-	        formItemAttributes: {
-	          label: '排序',
-	          prop: 'sortNum',
-	          rules: []
-	        },
-		}, {
-        md: 24,
-        isShow: true,
-        name: 'el-input',
-        attributes: { placeholder: '请输入备注内容',type: "textarea", rows: 3 },
-        formItemAttributes: {
-          label: '备注',
-          prop: 'remark',
-          rules: []
-        }
-      }]
-	  }
-  },
-  methods: {
-    // 列表请求函数
-	getList(p) {
-	  try {
-	    var pam = JSON.parse(JSON.stringify(p))
-	    if (this.dictType) {
-	      pam.params.push({ "param": "a.dict_type", "compare": "=", "value": this.dictType })
-	    }
-	    return getDataDictionary(pam)
-	  } catch (error) {
-	    console.log(error)
-	  }
+	components: {
+		TemplatePage,
+		AddDataDictionary
 	},
-    // 列表导出函数
-    exportList: getDataDictionaryExport,
-	getType(){
-		getType().then(res => {
-			this.typeList = res.data
-		    this.$refs.pageRef.refreshList()
-		})
+	mixins: [import_mixin],
+	data() {
+		return {
+			// 事件组合
+			optionsEvensGroup: [
+				[
+					[
+						{
+							name: '新增',
+							click: this.addData
+						}
+					]
+				],
+				[
+					[
+						{
+							name: '下载导入模板',
+							click: this.handleDownload
+						}
+					],
+					[
+						{
+							name: '导入模板',
+							render: () => {
+								return this.importButton(listImport, '导入模板')
+							}
+						}
+					],
+				]
+			],
+			// 表格属性
+			tableAttributes: {},
+			// 表格事件
+			tableEvents: {},
+			visible: false,
+			item: null,
+			dictType: 'ASSIST_UNIT',
+			dictTypeName: '辅材单位',
+			typeList: [],
+			defaultProps: {
+				children: '',
+				label: 'remark'
+			},
+			/** 表单变量 */
+			formDialogType: 0,
+			formDialogTitles: ["新增", "编辑", "详情"],
+			formData: {
+				companyName: JSON.parse(localStorage.getItem('greemall_user')).companyName,
+				dictType: 'ASSIST_UNIT',
+				dictTypeName: '辅材单位',
+				dictValue: '',
+				status: 'ON',
+				sortNum: '',
+				remark: ''
+			}
+		}
 	},
-	handleNodeClick(e){
-		this.dictType = e.dictType
-		this.formData.dictType = e.dictType
-		this.formData.dictTypeName = e.remark
-		this.dictTypeName = e.remark
-		this.$refs.pageRef.refreshList()
+	created() {
+		this.getType()
 	},
-    // 表格列解析渲染数据更改
-    columnParsing(item, defaultData) {
-      return defaultData
-    },
-    operation() {
-      if (true) {
-        return (h, { row, index, column }) => {
-          return (
-            <div class="operation-btns">
-              {true ? (
-                <zj-button
-                  useLoading={false}
-                  parameter={[row]}
-                  buttonAttributes={{
-                    size: 'mini',
-                    type: 'primary'
-                  }}
-                  buttonEvents={{
-                    click: (...p) => {
-                      var [row] = p
-                      this.formData = row
-                      this.formDialogType = 1
-                      this.openForm()
-                    }
-                  }}
-                >
-                  编辑
-                </zj-button>
-              ) : null}
-              {true ? (
-                <el-popconfirm
-                  icon="el-icon-info"
-                  icon-color="red"
-                  title="这是一段内容确定删除吗?"
-                  onConfirm={() => {
-                    del({ id: row.sysDictId })
-                      .then(res => {
-                        this.$refs.pageRef.refreshList()
-                        this.$message({
-                          type: 'success',
-                          message: `删除成功!`
-                        })
-                      })
-                      .catch(err => {
-                        console.log(err)
-                      })
-                  }}
-                >
-                  <zj-button
-                    slot="reference"
-                    buttonAttributes={{
-                      size: 'mini',
-                      type: 'danger'
-                    }}
-                  >
-                    删除
-                  </zj-button>
-                </el-popconfirm>
-              ) : null}
-            </div>
-          )
-        }
-      }
-      return undefined
-    },
-	addData() {
-	  this.formDialogType = 0
-	  this.openForm()
+	computed: {
+		formItems() {
+			return [{
+				md: 24,
+				isShow: true,
+				name: 'el-input',
+				attributes: { placeholder: '请输入', disabled: true },
+				formItemAttributes: {
+					label: '所属商户',
+					prop: 'companyName',
+					rules: [...required]
+				},
+			}, {
+				md: 24,
+				isShow: true,
+				name: 'el-input',
+				attributes: { placeholder: '请输入', disabled: true },
+				formItemAttributes: {
+					label: '类型名称',
+					prop: 'dictTypeName',
+					rules: [...required]
+				},
+			}, {
+				md: 24,
+				isShow: true,
+				name: 'el-input',
+				attributes: { placeholder: '请输入' },
+				formItemAttributes: {
+					label: '字典值',
+					prop: 'dictValue',
+					rules: [...required]
+				},
+			}, {
+				md: 24,
+				isShow: true,
+				name: 'slot-component',
+				attributes: {},
+				formItemAttributes: {
+					label: '状态',
+					prop: 'status',
+					rules: [...required]
+				},
+				render: (h, { props, onInput }) => {
+					var { value } = props
+					return (
+						<el-radio-group v-model={this.formData.status}>
+							<el-radio disabled={this.formDialogType == 2} label="ON">启用</el-radio>
+							<el-radio disabled={this.formDialogType == 2} label="OFF">禁用</el-radio>
+						</el-radio-group>
+					)
+				}
+			}, {
+				md: 24,
+				isShow: true,
+				name: 'el-input',
+				attributes: { placeholder: '请输入' },
+				formItemAttributes: {
+					label: '排序',
+					prop: 'sortNum',
+					rules: []
+				},
+			}, {
+				md: 24,
+				isShow: true,
+				name: 'el-input',
+				attributes: { placeholder: '请输入备注内容', type: "textarea", rows: 3 },
+				formItemAttributes: {
+					label: '备注',
+					prop: 'remark',
+					rules: []
+				}
+			}]
+		}
 	},
-	openForm() {
-	  this.formDialog = true;
-	},
-	formCancel() {
-	  this.$refs.formRef.$refs.inlineForm.clearValidate()
-	  this.$data.formData = this.$options.data().formData
-	  this.formData.dictType = this.dictType
-	  this.formData.dictTypeName = this.dictTypeName
-	  this.formDialog = false
-	},
-	formConfirm() {
-	  this.$refs.formRef.validate((valid, invalidFields, errLabels) => {
-	    if (valid) {
-	      ([add, edit][this.formDialogType])(this.formData).then(res => {
-	        this.$message({ type: 'success', message: `${this.formDialogTitles[this.formDialogType]}成功!` })
-	        this.formCancel()
-	        this.$refs.pageRef.refreshList()
-	      })
-	    }
-	  })
-	},
-	// 下载导入模版
-	handleDownload() {
-		commonTemplateDownload({ name: '数据字典导入.xlsx' }, `${this.$route.meta.title}`).then(res => {
-		    this.$message({
-		        message: '下载成功',
-		        type: 'success'
-		    })
-		}).catch(err => {
-		    this.$message.error('下载失败')
-		})
-	},
-  }
+	methods: {
+		// 列表请求函数
+		getList(p) {
+			try {
+				var pam = JSON.parse(JSON.stringify(p))
+				if (this.dictType) {
+					pam.params.push({ "param": "a.dict_type", "compare": "=", "value": this.dictType })
+				}
+				return getDataDictionary(pam)
+			} catch (error) {
+				console.log(error)
+			}
+		},
+		// 列表导出函数
+		exportList: getDataDictionaryExport,
+		getType() {
+			getType().then(res => {
+				this.typeList = res.data
+				this.$refs.pageRef.refreshList()
+			})
+		},
+		handleNodeClick(e) {
+			this.dictType = e.dictType
+			this.formData.dictType = e.dictType
+			this.formData.dictTypeName = e.remark
+			this.dictTypeName = e.remark
+			this.$refs.pageRef.refreshList()
+		},
+		// 表格列解析渲染数据更改
+		columnParsing(item, defaultData) {
+			return defaultData
+		},
+		operation() {
+			if (true) {
+				return (h, { row, index, column }) => {
+					return (
+						<div class="operation-btns">
+							{true ? (
+								<zj-button
+									useLoading={false}
+									parameter={[row]}
+									buttonAttributes={{
+										size: 'mini',
+										type: 'primary'
+									}}
+									buttonEvents={{
+										click: (row) => {
+											this.$refs.tabPage.addTab({
+												// 对应显示的模块
+												activeKey: "detail",
+												// 唯一标识
+												key: "detail",
+												// 页签名称
+												label: "编辑",
+												// 打开时事件
+												triggerEvent: () => {
+													this.formCancel()
+													this.formDialogType = 1
+													this.$nextTick(() => {
+														this.formData = row
+													})
+												},
+												// 关闭时事件
+												closeEvent: () => {
+												}
+											})
+										}
+									}}
+								>
+									编辑
+								</zj-button>
+							) : null}
+							{true ? (
+								<el-popconfirm
+									icon="el-icon-info"
+									icon-color="red"
+									title="这是一段内容确定删除吗?"
+									onConfirm={() => {
+										del({ id: row.sysDictId })
+											.then(res => {
+												this.$refs.pageRef.refreshList()
+												this.$message({
+													type: 'success',
+													message: `删除成功!`
+												})
+											})
+											.catch(err => {
+												console.log(err)
+											})
+									}}
+								>
+									<zj-button
+										slot="reference"
+										buttonAttributes={{
+											size: 'mini',
+											type: 'danger'
+										}}
+									>
+										删除
+									</zj-button>
+								</el-popconfirm>
+							) : null}
+						</div>
+					)
+				}
+			}
+			return undefined
+		},
+		addData() {
+			this.$refs.tabPage.addTab({
+				// 对应显示的模块
+				activeKey: "add",
+				// 唯一标识
+				key: "add",
+				// 页签名称
+				label: "新增",
+				// 打开时事件
+				triggerEvent: () => {
+					this.formCancel()
+					this.formDialogType = 0
+				},
+				// 关闭时事件
+				closeEvent: () => {
+				}
+			})
+		},
+		formCancel() {
+			this.$refs?.formRef?.$refs?.inlineForm?.clearValidate();
+			this.$data.formData = this.$options.data().formData;
+			this.formData.dictType = this.dictType;
+			this.formData.dictTypeName = this.dictTypeName;
+		},
+		formConfirm(removeTab) {
+			this.$refs.formRef.validate((valid, invalidFields, errLabels) => {
+				if (valid) {
+					([add, edit][this.formDialogType])(this.formData).then(res => {
+						this.$message({
+							type: 'success',
+							message: this.formDialogTitles[this.formDialogType] + `成功!`
+						})
+						this.$refs.pageRef.refreshList();
+						removeTab('list')
+					})
+				}
+			})
+		},
+		// 下载导入模版
+		handleDownload() {
+			commonTemplateDownload({ name: '数据字典导入.xlsx' }, `${this.$route.meta.title}`).then(res => {
+				this.$message({
+					message: '下载成功',
+					type: 'success'
+				})
+			}).catch(err => {
+				this.$message.error('下载失败')
+			})
+		},
+	}
 }
 </script>
 
 <style lang="scss" scoped>
-	.title{
-		width: 120px;
-		margin: 24px 0 20px 20px;
-		padding-bottom: 10px;
-		border-bottom: 1px solid #cccccc;
-		font-weight: bold;
-	}
+.title {
+	width: 120px;
+	margin: 24px 0 20px 20px;
+	padding-bottom: 10px;
+	border-bottom: 1px solid #cccccc;
+	font-weight: bold;
+}
 </style>

+ 144 - 126
src/views/setting/departmentManage/index.vue

@@ -1,107 +1,109 @@
 <template>
-  <div class="app-container">
-    <div class="mymain-container">
-      <div>
-        <el-select v-model="value1" multiple placeholder="显示层级">
-          <el-option v-for="item in types" :key="item.value" :label="item.label" :value="item.value">
-          </el-option>
-        </el-select>
-        <span style="display: inline-block; width: 220px; margin-left: 10px"><el-input v-model="input"
-            placeholder="模糊搜索"></el-input></span>
-      </div>
+  <zj-tab-page ref="tabPage" :defaultActives="[{ key: 'list', label: '列表页面', essential: true }]">
+    <template slot-scope="{activeKey, data}">
+      <div class="app-container">
+        <div v-if="activeKey == 'list'" class="mymain-container">
+          <div>
+            <el-select v-model="value1" multiple placeholder="显示层级">
+              <el-option v-for="item in types" :key="item.value" :label="item.label" :value="item.value">
+              </el-option>
+            </el-select>
+            <span style="display: inline-block; width: 220px; margin-left: 10px"><el-input v-model="input"
+                placeholder="模糊搜索"></el-input></span>
+          </div>
 
-      <div class="table">
-        <el-table :data="showList" border>
-          <el-table-column prop="type" label="级别" width="70">
-            <template slot-scope="scope">
-              <el-tag v-if="scope.row.type == 'A'" type="success">平台</el-tag>
-              <el-tag v-if="scope.row.type == 'B'">商户</el-tag>
-              <el-tag v-if="scope.row.type == 'C'" type="warning">网点</el-tag>
-            </template>
-          </el-table-column>
-          <el-table-column prop="name" label="网点名称"> </el-table-column>
-          <el-table-column prop="" label="结构">
-            <template slot-scope="scope">
-              {{ scope.row.pname.join(' -> ') }}
-            </template>
-          </el-table-column>
-          <el-table-column align="center" label="状态" class-name="status-col" width="80">
-            <template slot-scope="scope">
-              <el-tag :type="scope.row.status ? 'success' : 'danger'">{{
-                scope.row.status ? '启用' : '禁用'
-              }}</el-tag>
-            </template>
-          </el-table-column>
-          <el-table-column label="操作" width="268" fixed="right">
-            <template slot-scope="scope">
-              <el-button type="primary" size="mini" icon="el-icon-edit"
-                @click="openMainForm('edit', scope.row.websitId)">编辑</el-button>
-              <el-button type="primary" size="mini" icon="el-icon-edit"
-                @click="handleDelete(scope.row.websitId)">删除</el-button>
-              <el-button v-if="!!~['A', 'B'].indexOf(scope.row.type)"
-                :type="({ A: 'primary', B: 'warning' })[scope.row.type]" plain size="mini" icon="el-icon-plus"
-                @click="openMainForm('add', scope.row.websitId)">
-                添加{{ scope.row.type
-                  == 'A' ? '商户' :
-                  scope.row.type == 'B' ? '网点' : '网点' }}
-              </el-button>
-            </template>
-          </el-table-column>
-        </el-table>
-      </div>
-      <div class="pagination clearfix">
-        <div class="fr">
-          <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="currentPage"
-            :page-sizes="[15, 20, 30, 50]" :page-size="pageSize" layout="total, sizes, prev, pager, next, jumper"
-            :total="listTotal">
-          </el-pagination>
+          <div class="table">
+            <el-table :data="showList" border>
+              <el-table-column prop="type" label="级别" width="70">
+                <template slot-scope="scope">
+                  <el-tag v-if="scope.row.type == 'A'" type="success">平台</el-tag>
+                  <el-tag v-if="scope.row.type == 'B'">商户</el-tag>
+                  <el-tag v-if="scope.row.type == 'C'" type="warning">网点</el-tag>
+                </template>
+              </el-table-column>
+              <el-table-column prop="name" label="网点名称"> </el-table-column>
+              <el-table-column prop="" label="结构">
+                <template slot-scope="scope">
+                  {{ scope.row.pname.join(' -> ') }}
+                </template>
+              </el-table-column>
+              <el-table-column align="center" label="状态" class-name="status-col" width="80">
+                <template slot-scope="scope">
+                  <el-tag :type="scope.row.status ? 'success' : 'danger'">{{
+                    scope.row.status ? '启用' : '禁用'
+                  }}</el-tag>
+                </template>
+              </el-table-column>
+              <el-table-column label="操作" width="268" fixed="right">
+                <template slot-scope="scope">
+                  <el-button type="primary" size="mini" icon="el-icon-edit"
+                    @click="openMainForm('edit', scope.row.websitId)">编辑</el-button>
+                  <el-button type="primary" size="mini" icon="el-icon-edit"
+                    @click="handleDelete(scope.row.websitId)">删除</el-button>
+                  <el-button v-if="!!~['A', 'B'].indexOf(scope.row.type)"
+                    :type="({ A: 'primary', B: 'warning' })[scope.row.type]" plain size="mini" icon="el-icon-plus"
+                    @click="openMainForm('add', scope.row.websitId)">
+                    添加{{ scope.row.type
+                      == 'A' ? '商户' :
+                      scope.row.type == 'B' ? '网点' : '网点' }}
+                  </el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </div>
+          <div class="pagination clearfix">
+            <div class="fr">
+              <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
+                :current-page="currentPage" :page-sizes="[15, 20, 30, 50]" :page-size="pageSize"
+                layout="total, sizes, prev, pager, next, jumper" :total="listTotal">
+              </el-pagination>
+            </div>
+          </div>
         </div>
-      </div>
-    </div>
-    <!-- 添加编辑网点 -->
-    <el-dialog :title="mainFormType == 'add' ? '添加' : '编辑'" :visible.sync="mainFormVisible" :show-close="false"
-      width="40%" :close-on-click-modal="false">
-      <el-form ref="mainForm" :model="mainForm" :rules="mainFormRules" label-position="top" label-width="80px">
-        <el-form-item label="上级" prop="parentId">
-          <el-cascader style="width: 100%" :options="dataList2"
-            :props="{ checkStrictly: true, value: 'websitId', label: 'name' }" v-model="mainForm.parentId" filterable
-            clearable>
-          </el-cascader>
-        </el-form-item>
-        <el-form-item label="名称" prop="name">
-          <el-input placeholder="请输入网点名称" v-model="mainForm.name"></el-input>
-        </el-form-item>
-        <el-form-item label="联系人" prop="linkName">
-          <el-input placeholder="请输入联系人名称" v-model="mainForm.linkName"></el-input>
-        </el-form-item>
-        <el-form-item label="联系人电话" prop="websitPhone">
-          <el-input placeholder="请输入联系人电话" maxlength="11" type="number" v-model="mainForm.websitPhone"></el-input>
-        </el-form-item>
-        <el-form-item label="地址" prop="address">
-          <div style="display:flex;">
-            <el-input placeholder="请选择地址" readonly style="margin-right: 20px;" v-model="mainForm.address"></el-input>
-            <geographicalPosi :formData="mainForm" @selectPosi="selectAddress"></geographicalPosi>
+        <div v-if="~['add', 'edit'].indexOf(activeKey)">
+          <el-form ref="mainForm" :model="mainForm" :rules="mainFormRules" label-position="top" label-width="80px">
+            <el-form-item label="上级" prop="parentId">
+              <el-cascader style="width: 100%" :options="dataList2"
+                :props="{ checkStrictly: true, value: 'websitId', label: 'name' }" v-model="mainForm.parentId" filterable
+                clearable>
+              </el-cascader>
+            </el-form-item>
+            <el-form-item label="名称" prop="name">
+              <el-input placeholder="请输入网点名称" v-model="mainForm.name"></el-input>
+            </el-form-item>
+            <el-form-item label="联系人" prop="linkName">
+              <el-input placeholder="请输入联系人名称" v-model="mainForm.linkName"></el-input>
+            </el-form-item>
+            <el-form-item label="联系人电话" prop="websitPhone">
+              <el-input placeholder="请输入联系人电话" maxlength="11" type="number" v-model="mainForm.websitPhone"></el-input>
+            </el-form-item>
+            <el-form-item label="地址" prop="address">
+              <div style="display:flex;">
+                <el-input placeholder="请选择地址" readonly style="margin-right: 20px;" v-model="mainForm.address"></el-input>
+                <geographicalPosi :formData="mainForm" @selectPosi="selectAddress"></geographicalPosi>
+              </div>
+            </el-form-item>
+            <el-form-item label="状态" prop="status">
+              <el-radio-group v-model="mainForm.status">
+                <el-radio :label="true">启用</el-radio>
+                <el-radio :label="false">禁用</el-radio>
+              </el-radio-group>
+            </el-form-item>
+            <el-form-item label="增值服务" prop="isIncre">
+              <el-radio-group v-model="mainForm.isIncre">
+                <el-radio :label="true">启用</el-radio>
+                <el-radio :label="false">禁用</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-form>
+          <div slot="footer" class="dialog-footer">
+            <el-button @click="data.removeTab()">取 消</el-button>
+            <el-button type="primary" @click="submitMainForm(data.removeTab)">确 定</el-button>
           </div>
-        </el-form-item>
-        <el-form-item label="状态" prop="status">
-          <el-radio-group v-model="mainForm.status">
-            <el-radio :label="true">启用</el-radio>
-            <el-radio :label="false">禁用</el-radio>
-          </el-radio-group>
-        </el-form-item>
-        <el-form-item label="增值服务" prop="isIncre">
-          <el-radio-group v-model="mainForm.isIncre">
-            <el-radio :label="true">启用</el-radio>
-            <el-radio :label="false">禁用</el-radio>
-          </el-radio-group>
-        </el-form-item>
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button @click="cancelMainForm">取 消</el-button>
-        <el-button type="primary" @click="submitMainForm">确 定</el-button>
+        </div>
       </div>
-    </el-dialog>
-  </div>
+    </template>
+  </zj-tab-page>
 </template>
 
 <script>
@@ -242,39 +244,55 @@ export default {
 
     // 打开 新增编辑 网点表单
     openMainForm(type, id) {
-      this.mainFormType = type
-      this.mainFormVisible = true
-      if (type == 'add') {
-        this.mainForm.parentId = id
-      } else {
-        this.editId = id
-        getDepartmentDetail({ id }).then(res => {
-          this.mainForm = {
-            parentId: res.data.parentId,
-            name: res.data.name,
-            linkName: res.data.linkName,
-            websitPhone: res.data.websitPhone,
-            lat: res.data.lat,
-            lng: res.data.lng,
-            address: res.data.address,
-            status: res.data.status,
-            isIncre: res.data.isIncre
-          }
-        })
-      }
+      this.$refs.tabPage.addTab({
+        // 对应显示的模块
+        activeKey: type,
+        // 唯一标识
+        key: type,
+        // 页签名称
+        label: ({ edit: "编辑", add: "新增" })[type],
+        // 打开时事件
+        triggerEvent: () => {
+          this.cancelMainForm()
+          this.$nextTick(() => {
+            this.mainFormType = type
+            this.mainFormVisible = true
+            if (type == 'add') {
+              this.mainForm.parentId = id
+            } else {
+              this.editId = id
+              getDepartmentDetail({ id }).then(res => {
+                this.mainForm = {
+                  parentId: res.data.parentId,
+                  name: res.data.name,
+                  linkName: res.data.linkName,
+                  websitPhone: res.data.websitPhone,
+                  lat: res.data.lat,
+                  lng: res.data.lng,
+                  address: res.data.address,
+                  status: res.data.status,
+                  isIncre: res.data.isIncre
+                }
+              })
+            }
+          })
+        },
+        // 关闭时事件
+        closeEvent: () => {
+
+        }
+      })
     },
 
     // 取消 新增编辑 网点表单
     cancelMainForm() {
       this.mainFormVisible = false
-      this.$refs.mainForm.resetFields()
-      this.mainForm.parentId = ''
-      this.mainForm.address = ''
-      this.mainForm.name = ''
+      this.$refs?.mainForm?.resetFields()
+      this.$data.mainForm = this.$options.data().mainForm
     },
 
     // 提交 网点表单
-    submitMainForm() {
+    submitMainForm(removeTab) {
       this.$refs.mainForm.validate(valid => {
         if (valid) {
           let parentId = null
@@ -297,15 +315,15 @@ export default {
           if (this.mainFormType == 'edit') {
             params.websitId = this.editId
             editDepartment(params).then(res => {
-              this.cancelMainForm()
               this.getList()
               this.$successMsg('编辑成功')
+              removeTab('list')
             })
           } else {
             addDepartment(params).then(res => {
-              this.cancelMainForm()
               this.getList()
               this.$successMsg('添加成功')
+              removeTab('list')
             })
           }
         }

+ 115 - 52
src/views/setting/notification/announcement/index.vue

@@ -1,40 +1,50 @@
 <template>
-	<template-page ref="pageRef" :get-list="getList" :table-attributes="tableAttributes" :table-events="tableEvents"
-		:operationColumnWidth="120" :options-evens-group="optionsEvensGroup" :moreParameters="moreParameters"
-		:column-parsing="columnParsing" :operation="operation" :exportList="exportList">
-		<div slot="moreSearch">
-			<el-radio-group v-model="status" size="mini" @change="changeType">
-				<el-radio-button label="">全部</el-radio-button>
-				<el-radio-button label="NO">未发布</el-radio-button>
-				<el-radio-button label="YES">已发布</el-radio-button>
-			</el-radio-group>
-			<br><br>
-		</div>
-		<el-dialog title="" width="800px" custom-class="diy-dialog" append-to-body :modal="true" :visible.sync="formDialog"
-			:show-close="true" :close-on-click-modal="false" :modal-append-to-body="false" :before-close="formCancel">
-			<zj-form-container ref="formRef" :form-data="formData" :styleSwitch="false">
-				<zj-form-module :title="formDialogTitles[formDialogType]" label-width="100px" :showPackUp="false"
-					:form-data="formData" :form-items="formItems">
-				</zj-form-module>
-			</zj-form-container>
-			<div slot="footer" class="dialog-footer">
-				<el-button size="mini" @click="formCancel">取 消</el-button>
-				<el-button v-if="formDialogType < 2" size="mini" type="primary" @click="formConfirm('NO')">保存</el-button>
-				<el-button v-if="formDialogType < 2" size="mini" type="primary" @click="formConfirm('YES')">发布</el-button>
+	<zj-tab-page ref="tabPage" :defaultActives="[{ key: 'list', label: '列表页面', essential: true }]">
+		<template slot-scope="{activeKey, data}">
+			<div :style="{
+				width: '100%',
+				height: activeKey == 'list' ? '100%' : '0px',
+				overflow: 'hidden'
+			}">
+				<template-page ref="pageRef" :get-list="getList" :table-attributes="tableAttributes" :table-events="tableEvents"
+					:operationColumnWidth="200" :options-evens-group="optionsEvensGroup" :moreParameters="moreParameters"
+					:column-parsing="columnParsing" :operation="operation" :exportList="exportList">
+					<div slot="moreSearch">
+						<el-radio-group v-model="status" size="mini" @change="changeType">
+							<el-radio-button label="">全部</el-radio-button>
+							<el-radio-button label="NO">未发布</el-radio-button>
+							<el-radio-button label="YES">已发布</el-radio-button>
+						</el-radio-group>
+						<br><br>
+					</div>
+				</template-page>
 			</div>
-		</el-dialog>
-		<el-dialog title="" width="500px" custom-class="diy-dialog" append-to-body :modal="true" :visible.sync="formDialog2"
-			:show-close="true" :close-on-click-modal="false" :modal-append-to-body="false" :before-close="formCancel">
-			<zj-form-container ref="formRef" :form-data="formData" :styleSwitch="false">
-				<zj-form-module :title="formDialogTitles[formDialogType]" label-width="100px" :showPackUp="false"
-					:form-data="formData" :form-items="formItems2">
-				</zj-form-module>
-			</zj-form-container>
-			<div slot="footer" class="dialog-footer">
-				<el-button size="mini" @click="formCancel">取 消</el-button>
+			<div v-if="~['add', 'edit'].indexOf(activeKey)" style="box-sizing: border-box;padding: 16px;">
+				<zj-form-container ref="formRef" :form-data="formData" :styleSwitch="false">
+					<zj-form-module :title="data.label" label-width="100px" :showPackUp="false" :form-data="formData"
+						:form-items="formItems">
+					</zj-form-module>
+				</zj-form-container>
+				<div slot="footer" class="dialog-footer">
+					<el-button size="mini" @click="data.removeTab()">取 消</el-button>
+					<el-button v-if="formDialogType < 2" size="mini" type="primary"
+						@click="formConfirm('NO', data.removeTab)">保存</el-button>
+					<el-button v-if="formDialogType < 2" size="mini" type="primary"
+						@click="formConfirm('YES', data.removeTab)">发布</el-button>
+				</div>
 			</div>
-		</el-dialog>
-	</template-page>
+			<div v-if="~['detail'].indexOf(activeKey)" style="box-sizing: border-box;padding: 16px;">
+				<zj-form-container ref="formRef" :form-data="formData" :styleSwitch="false">
+					<zj-form-module :title="data.label" label-width="100px" :showPackUp="false" :form-data="formData"
+						:form-items="formItems2">
+					</zj-form-module>
+				</zj-form-container>
+				<div slot="footer" class="dialog-footer">
+					<el-button size="mini" @click="data.removeTab()">取 消</el-button>
+				</div>
+			</div>
+		</template>
+	</zj-tab-page>
 </template>
 
 <script>
@@ -75,14 +85,12 @@ export default {
 			recordSelected: [],
 			/** 表单变量 */
 			formDialogType: 0,
-			formDialogTitles: ["新增", "编辑", "详情"],
-			formDialog: false,
-			formDialog2: false,
 			formData: {
 				type: "A",
 				title: "",
 				files: [],
 				adminWebsitIds: [],
+				adminNickName: "",
 				workerIds: [],
 				content: "",
 			},
@@ -134,7 +142,7 @@ export default {
 				name: 'zj-paging-pull-down',
 				options: this.websitList,
 				attributes: {
-					valueKey: "companyWechatId",
+					valueKey: "adminUserId",
 					labelKey: "companyName",
 					size: 'mini',
 					placeholder: '请选择',
@@ -268,7 +276,7 @@ export default {
 				},
 				render: (h, { props, onInput }) => {
 					var { value } = props
-					return <div>{this.websitList.filter(item => !!~value.indexOf(item.companyWechatId)).map(item => <el-tag style="margin-right:5px">{item.companyName}</el-tag>)}</div>
+					return <div>{this.websitList.filter(item => !!~value.indexOf(item.adminUserId)).map(item => <el-tag style="margin-right:5px">{item.companyName}</el-tag>)}</div>
 				},
 			},
 			{
@@ -339,10 +347,58 @@ export default {
 		operation(h, { row, index, column }) {
 			return (<div class='operation-btns'>
 				{row.status == "NO" ? <el-button type="text" onClick={() => {
-					this.getNoticeDetail(row.noticeId,1,'')
+					this.$refs.tabPage.addTab({
+						activeKey: "edit",
+						key: "edit",
+						label: "编辑",
+						triggerEvent: () => {
+							this.formCancel()
+							this.$nextTick(() => {
+								getNoticeDetail({
+									noticeId: row.noticeId
+								}).then(res => {
+									Object.assign(this.formData, res.data, {
+										files: res.data.files ? res.data.files.map(item => ({
+											...item,
+											size: item.fileSize,
+											type: item.fileType,
+										})) : []
+									})
+									this.formDialogType = 1
+									this.openForm()
+								})
+							})
+						},
+						closeEvent: () => {
+						}
+					})
 				}}>编辑</el-button> : null}
 				<el-button type="text" onClick={() => {
-					this.getNoticeDetail(row.noticeId,2,'formDialog2')
+					this.$refs.tabPage.addTab({
+						activeKey: "detail",
+						key: "detail",
+						label: "查看",
+						triggerEvent: () => {
+							this.formCancel()
+							this.$nextTick(() => {
+								getNoticeDetail({
+									noticeId: row.noticeId
+								}).then(res => {
+									Object.assign(this.formData, res.data, {
+										files: res.data.files ? res.data.files.map(item => ({
+											...item,
+											size: item.fileSize,
+											type: item.fileType,
+										})) : []
+									})
+									this.formDialogType = 2
+									this.openForm()
+								})
+							})
+						},
+						closeEvent: () => {
+						}
+					})
 				}}>查看</el-button>
 				{row.status == "NO" ? <el-popconfirm
 					title={`是否确定删除?`}
@@ -371,31 +427,38 @@ export default {
 			</div>)
 		},
 		addData() {
-			this.formDialogType = 0
-			this.openForm()
+			this.$refs.tabPage.addTab({
+				activeKey: "add",
+				key: "add",
+				label: "新增",
+				triggerEvent: () => {
+					this.formCancel()
+					this.$nextTick(() => {
+						this.formDialogType = 0
+						this.openForm()
+					})
+				},
+				closeEvent: () => {
+				}
+			})
 		},
-		openForm(key = 'formDialog') {
+		openForm() {
 			if (JSON.parse(localStorage.getItem("greemall_user")).type == 2) {
 				getListaa({ pageNum: 1, pageSize: -1, type: 1 }).then((res) => {
 					this.websitList = res.data.records
-					this[key] = true;
 				})
 			} else {
 				getMemberList({ "pageNum": 1, "pageSize": -1, type: "WORKER" }).then(res => {
-					console.log(res.data.records)
 					this.workerList = res.data.records
-					this[key] = true;
 				})
 			}
 		},
 		formCancel() {
-			this.$refs.formRef.$refs.inlineForm.clearValidate()
+			this.$refs?.formRef?.$refs?.inlineForm?.clearValidate()
 			this.$data.formData = this.$options.data().formData
-			this.formDialog = false
-			this.formDialog2 = false
 			this.websitList = []
 		},
-		formConfirm(status) {
+		formConfirm(status, removeTab) {
 			this.$refs.formRef.validate((valid, invalidFields, errLabels) => {
 				if (valid) {
 					[noticeAdd, noticeUpdate][this.formDialogType]({
@@ -411,7 +474,7 @@ export default {
 							type: 'success',
 							message: status == "YES" ? '发送成功!' : '保存成功!'
 						})
-						this.formCancel()
+						removeTab('list')
 						this.$refs.pageRef.refreshList()
 					})
 				}

+ 53 - 38
src/views/setting/notification/systemMessage/index.vue

@@ -1,19 +1,28 @@
 <template>
-	<template-page ref="pageRef" :get-list="getList" :table-attributes="tableAttributes" :table-events="tableEvents"
-		:operationColumnWidth="200" :options-evens-group="optionsEvensGroup" :moreParameters="moreParameters"
-		:column-parsing="columnParsing" :operation="operation" :exportList="exportList">
-		<el-dialog title="" width="500px" custom-class="diy-dialog" append-to-body :modal="true" :visible.sync="formDialog2"
-			:show-close="true" :close-on-click-modal="false" :modal-append-to-body="false" :before-close="formCancel">
-			<zj-form-container ref="formRef" :form-data="formData" :styleSwitch="false">
-				<zj-form-module :title="formDialogTitles[formDialogType]" label-width="100px" :showPackUp="false"
-					:form-data="formData" :form-items="formItems2">
-				</zj-form-module>
-			</zj-form-container>
-			<div slot="footer" class="dialog-footer">
-				<el-button size="mini" @click="formCancel">取 消</el-button>
+	<zj-tab-page ref="tabPage" :defaultActives="[{ key: 'list', label: '列表页面', essential: true }]">
+		<template slot-scope="{activeKey, data}">
+			<div :style="{
+				width: '100%',
+				height: activeKey == 'list' ? '100%' : '0px',
+				overflow: 'hidden'
+			}">
+				<template-page ref="pageRef" :get-list="getList" :table-attributes="tableAttributes" :table-events="tableEvents"
+					:operationColumnWidth="200" :options-evens-group="optionsEvensGroup" :moreParameters="moreParameters"
+					:column-parsing="columnParsing" :operation="operation" :exportList="exportList">
+				</template-page>
 			</div>
-		</el-dialog>
-	</template-page>
+			<div v-if="~['detail'].indexOf(activeKey)" style="box-sizing: border-box;padding: 16px;">
+				<zj-form-container ref="formRef" :form-data="formData" :styleSwitch="false">
+					<zj-form-module :title="data.label" label-width="100px" :showPackUp="false" :form-data="formData"
+						:form-items="formItems2">
+					</zj-form-module>
+				</zj-form-container>
+				<div slot="footer" class="dialog-footer">
+					<el-button size="mini" @click="data.removeTab()">取 消</el-button>
+				</div>
+			</div>
+		</template>
+	</zj-tab-page>
 </template>
 
 <script>
@@ -21,7 +30,7 @@ import TemplatePage from '@/components/template/template-page-1.vue'
 import import_mixin from '@/components/template/import_mixin.js'
 import ImageUpload from '@/components/file-upload'
 import { required, mobileRequired, mobile } from '@/components/template/rules_verify.js'
-import { noticeListPageV2, noticePageExport, getNoticeDetail, noticeAdd, noticeUpdate, noticeDel } from "@/api/announcement";
+import { noticeReadList, noticeReadListExport, getNoticeDetail, zfapiNoticeDetail, noticeAdd, noticeUpdate, noticeDel } from "@/api/announcement";
 import { memberListPageV2 } from "@/api/masterManagement";
 import { getList as getListaa } from "@/api/merchant";
 export default {
@@ -44,9 +53,6 @@ export default {
 			recordSelected: [],
 			/** 表单变量 */
 			formDialogType: 0,
-			formDialogTitles: ["新增", "编辑", "详情"],
-			formDialog: false,
-			formDialog2: false,
 			formData: {
 				type: "A",
 				title: "",
@@ -129,9 +135,9 @@ export default {
 	},
 	methods: {
 		// 列表请求函数
-		getList:noticeListPageV2,
+		getList: noticeReadList,
 		// 列表导出函数
-		exportList: noticePageExport,
+		exportList: noticeReadListExport,
 		// 表格列解析渲染数据更改
 		columnParsing(item, defaultData) {
 			return defaultData
@@ -144,40 +150,49 @@ export default {
 		operation(h, { row, index, column }) {
 			return (<div class='operation-btns'>
 				<el-button type="text" onClick={() => {
-					getNoticeDetail({
-						noticeId: row.noticeId
-					}).then(res => {
-						Object.assign(this.formData, res.data, {
-							files: res.data.files ? res.data.files.map(item => ({
-								...item,
-								size: item.fileSize,
-								type: item.fileType,
-							})) : []
-						})
-						this.formDialogType = 2
-						this.openForm('formDialog2')
+					this.$refs.tabPage.addTab({
+						activeKey: "detail",
+						key: "detail",
+						label: "查看",
+						triggerEvent: () => {
+							this.formCancel()
+							this.$nextTick(() => {
+								zfapiNoticeDetail({
+									id: row.id
+								}).then(res => {
+									console.log(res)
+									Object.assign(this.formData, res.data, {
+										files: res.data.files ? res.data.files.map(item => ({
+											...item,
+											size: item.fileSize,
+											type: item.fileType,
+										})) : []
+									})
+									this.formDialogType = 2
+									this.openForm()
+								})
+							})
+						},
+						closeEvent: () => {
+						}
 					})
 				}}>查看</el-button>
 			</div>)
 		},
-		openForm(key = 'formDialog') {
+		openForm() {
 			if (JSON.parse(localStorage.getItem("greemall_user")).type == 2) {
 				getListaa({ pageNum: 1, pageSize: -1, type: 1 }).then((res) => {
 					this.websitList = res.data.records
-					this[key] = true;
 				})
 			} else {
 				memberListPageV2({ "pageNum": 1, "pageSize": -1, "params": [] }).then(res => {
 					this.workerList = res.data.records
-					this[key] = true;
 				})
 			}
 		},
 		formCancel() {
-			this.$refs.formRef.$refs.inlineForm.clearValidate()
+			this.$refs?.formRef?.$refs?.inlineForm?.clearValidate()
 			this.$data.formData = this.$options.data().formData
-			this.formDialog = false
-			this.formDialog2 = false
 			this.websitList = []
 		},
 	}

+ 116 - 112
src/views/setting/role/index.vue

@@ -1,74 +1,73 @@
 <template>
-  <div class="app-container">
-    <div class="setting_title">权限管理</div>
-    <el-divider></el-divider>
-
-    <div class="mymain-container">
-      <div class="btn-group clearfix">
-        <div class="fl">
-          <el-button size="small" type="primary" icon="el-icon-plus" @click="addOrEdit('add')">新增角色</el-button>
-        </div>
-        <div class="fr">
+  <zj-tab-page ref="tabPage" :defaultActives="[{ key: 'list', label: '列表页面', essential: true }]">
+    <template slot-scope="{activeKey, data}">
+      <div :style="{
+        width: '100%',
+        height: activeKey == 'list' ? '100%' : '0px',
+        overflow: 'hidden'
+      }">
+        <div class="app-container">
+          <div class="setting_title">权限管理</div>
+          <el-divider></el-divider>
+          <div class="mymain-container">
+            <div class="btn-group clearfix">
+              <div class="fl">
+                <el-button size="small" type="primary" icon="el-icon-plus" @click="addOrEdit('add')">新增角色</el-button>
+              </div>
+              <div class="fr">
+              </div>
+            </div>
+            <div class="table">
+              <el-table v-loading="listLoading" :data="dataList" element-loading-text="Loading" border fit
+                highlight-current-row stripe>
+                <el-table-column align="center" label="序号" type="index" width="50"></el-table-column>
+                <el-table-column align="center" label="角色" prop="name"></el-table-column>
+                <el-table-column align="center" label="操作" width="180">
+                  <template slot-scope="scope">
+                    <el-button type="text" @click="setMenuRole(scope.row.adminRoleId)">设置权限</el-button>
+                    <el-button type="text" @click="addOrEdit('edit', scope.row.adminRoleId)"
+                      v-if="scope.row.adminRoleId != 1">编辑</el-button>
+                    <el-popconfirm style="margin-left: 10px;" title="确定删除吗?"
+                      @confirm="handleDelete(scope.row.adminRoleId)" v-if="scope.row.adminRoleId != 1">
+                      <el-button slot="reference" type="text">删除</el-button>
+                    </el-popconfirm>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+            <div class="pagination clearfix">
+              <div class="fr">
+                <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
+                  :current-page="currentPage" :page-sizes="[10, 20, 30, 50]" :page-size="10"
+                  layout="total, sizes, prev, pager, next, jumper" :total="listTotal">
+                </el-pagination>
+              </div>
+            </div>
+          </div>
         </div>
       </div>
-
-      <div class="table">
-        <el-table v-loading="listLoading" :data="dataList" element-loading-text="Loading" border fit highlight-current-row
-          stripe>
-          <el-table-column align="center" label="序号" type="index" width="50"></el-table-column>
-          <el-table-column align="center" label="角色" prop="name"></el-table-column>
-          <el-table-column align="center" label="操作" width="180">
-            <template slot-scope="scope">
-              <el-button type="text" @click="setMenuRole(scope.row.adminRoleId)">设置权限</el-button>
-              <el-button type="text" @click="addOrEdit('edit', scope.row.adminRoleId)"
-                v-if="scope.row.adminRoleId != 1">编辑</el-button>
-              <el-popconfirm style="margin-left: 10px;" title="确定删除吗?" @confirm="handleDelete(scope.row.adminRoleId)"
-                v-if="scope.row.adminRoleId != 1">
-                <el-button slot="reference" type="text">删除</el-button>
-              </el-popconfirm>
-            </template>
-          </el-table-column>
-        </el-table>
-      </div>
-
-      <div class="pagination clearfix">
-        <div class="fr">
-          <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="currentPage"
-            :page-sizes="[10, 20, 30, 50]" :page-size="10" layout="total, sizes, prev, pager, next, jumper"
-            :total="listTotal">
-          </el-pagination>
+      <div v-if="~['add', 'edit'].indexOf(activeKey)" style="box-sizing: border-box;padding: 16px;">
+        <el-form ref="addForm" :model="addForm" :rules="addFormRules" label-position="left" label-width="100px">
+          <el-form-item label="角色名" prop="name">
+            <el-input v-model="addForm.name" autocomplete="off" placeholder="请输入角色名"></el-input>
+          </el-form-item>
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+          <el-button size="mini" @click="data.removeTab()">取 消</el-button>
+          <el-button size="mini" type="primary" @click="submitAddForm(data.removeTab)">确 定</el-button>
         </div>
       </div>
-    </div>
-
-    <!-- 新增编辑 -->
-    <el-dialog :title="addFormType == 'add' ? '新增角色' : '编辑角色'" :visible.sync="addFormVisible" :show-close="false"
-      width="40%" :close-on-click-modal="false">
-      <el-form ref="addForm" :model="addForm" :rules="addFormRules" label-position="left" label-width="100px">
-        <el-form-item label="角色名" prop="name">
-          <el-input v-model="addForm.name" autocomplete="off" placeholder="请输入角色名"></el-input>
-        </el-form-item>
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button @click="cancelAddForm">取 消</el-button>
-        <el-button type="primary" @click="submitAddForm">确 定</el-button>
-      </div>
-    </el-dialog>
-
-    <!-- 设置权限 -->
-    <el-dialog title="设置权限" :visible.sync="roleFormVisible" :show-close="false" width="1000" :close-on-click-modal="false"
-      custom-class="tree-dialog" top="50px">
-      <!-- :check-strictly="true" -->
-      <zj-tree :data="menuRoleList" show-checkbox :default-expand-all="true" node-key="moduleId" ref="tree"
-        highlight-current :props="defaultProps">
-      </zj-tree>
-      <div slot="footer" class="dialog-footer">
-        <el-button @click="roleFormVisible = false">{{ editId != 1 ? '取 消' : '关 闭' }}</el-button>
-        <el-button type="primary" @click="submitRoleForm" v-if="editId != 1">确 定</el-button>
+      <div v-if="~['detail'].indexOf(activeKey)" style="box-sizing: border-box;padding: 16px;">
+        <zj-tree :data="menuRoleList" show-checkbox :default-expand-all="true" node-key="moduleId" ref="tree"
+          highlight-current :props="defaultProps">
+        </zj-tree>
+        <div slot="footer" class="dialog-footer">
+          <el-button size="mini" @click="data.removeTab()">{{ editId != 1 ? '取 消' : '关 闭' }}</el-button>
+          <el-button size="mini" type="primary" @click="submitRoleForm(data.removeTab)" v-if="editId != 1">确 定</el-button>
+        </div>
       </div>
-    </el-dialog>
-
-  </div>
+    </template>
+  </zj-tab-page>
 </template>
 
 <script>
@@ -84,10 +83,8 @@ export default {
       currentPage: 1, // 当前页码
       pageSize: 10, // 每页数量
       listTotal: 0, // 列表总数
-
       editId: null,
       addFormType: 'add',
-      addFormVisible: false,
       addForm: {
         name: '', // 角色名
       },
@@ -96,9 +93,6 @@ export default {
           { required: true, message: '请输入角色名', trigger: 'blur' }
         ],
       },
-
-      roleFormVisible: false,
-
       menuRoleList: [],
       defaultProps: {
         children: 'children',
@@ -118,12 +112,10 @@ export default {
   methods: {
     getList() {
       this.listLoading = true;
-
       let params = {
         pageNum: this.currentPage,
         pageSize: this.pageSize
       };
-
       getRoleList(params).then(res => {
         this.dataList = res.data.records;
         this.listTotal = res.data.total;
@@ -154,26 +146,30 @@ export default {
 
     // 新增编辑
     addOrEdit(type, id) {
-      this.addFormType = type;
-      this.addFormVisible = true;
-      if (type == 'edit') {
-        this.editId = id;
-        getRoleDetail({ adminRoleId: id }).then(res => {
-          this.addForm = {
-            name: res.data.name
+      this.$refs.tabPage.addTab({
+        activeKey: type,
+        key: type,
+        label: ({ add: "新增", edit: "编辑" })[type],
+        triggerEvent: () => {
+          this.$refs?.addForm?.resetFields();
+          this.$data.addForm = this.$options.data().addForm
+          this.addFormType = type;
+          if (type == 'edit') {
+            this.editId = id;
+            getRoleDetail({ adminRoleId: id }).then(res => {
+              this.addForm = {
+                name: res.data.name
+              }
+            })
           }
-        })
-      }
-    },
-
-    // 取消 新增编辑
-    cancelAddForm() {
-      this.addFormVisible = false;
-      this.$refs.addForm.resetFields();
+        },
+        closeEvent: () => {
+        }
+      })
     },
 
     // 提交 新增编辑
-    submitAddForm() {
+    submitAddForm(removeTab) {
       this.$refs.addForm.validate((valid) => {
         if (valid) {
           let params = {
@@ -182,13 +178,13 @@ export default {
           if (this.addFormType == 'edit') {
             params.adminRoleId = this.editId;
             editRole(params).then(res => {
-              this.cancelAddForm();
+              removeTab('list');
               this.getList();
               this.$successMsg('编辑成功');
             })
           } else {
             addRole(params).then(res => {
-              this.cancelAddForm();
+              removeTab('list');
               this.getList();
               this.$successMsg('新增成功');
             })
@@ -199,39 +195,47 @@ export default {
 
     // 设置权限 - 获取列表
     setMenuRole(id) {
-      this.roleFormVisible = true;
-      this.editId = id;
-
-      function aaa(list){
-        for(var item of list){
-          if(item.type==3){
-            item.tiling = true
-            item.labelWidthNum = 115
-          }
-          if(item.children && item.children.length){
-            aaa(item.children)
-          }
+      this.$refs.tabPage.addTab({
+        activeKey: "detail",
+        key: "detail",
+        label: "设置权限",
+        triggerEvent: () => {
+          this.$nextTick(() => {
+            this.editId = id;
+            function aaa(list) {
+              for (var item of list) {
+                if (item.type == 3) {
+                  item.tiling = true
+                  item.labelWidthNum = 115
+                }
+                if (item.children && item.children.length) {
+                  aaa(item.children)
+                }
+              }
+            }
+            getMenuList({ adminUserId: this.userid }).then(res => {
+              aaa(res.data);
+              this.menuRoleList = res.data
+            })
+            getMenuRoleIds({ adminRoleId: id }).then(res => {
+              this.$refs.tree.setCheckedKeys(res.data);
+            })
+          })
+        },
+        closeEvent: () => {
         }
-      }
-
-      getMenuList({ adminUserId: this.userid }).then(res => {
-        aaa(res.data);
-        this.menuRoleList = res.data
-      })
-      getMenuRoleIds({ adminRoleId: id }).then(res => {
-        this.$refs.tree.setCheckedKeys(res.data);
       })
     },
 
     // 设置权限 - 提交数据
-    submitRoleForm() {
+    submitRoleForm(removeTab) {
       let params = {
         adminModuleIds: this.$refs.tree.getCheckedKeys(),
         adminModuleIds2: this.$refs.tree.getHalfCheckedKeys(),
         adminRoleId: this.editId,
       }
       setMenuRole(params).then(res => {
-        this.roleFormVisible = false;
+        removeTab('list')
         this.getList();
         this.$successMsg();
       })

+ 181 - 172
src/views/userManagement/masterManagement/index.vue

@@ -1,42 +1,52 @@
 <template>
-	<template-page ref="pageRef" :get-list="getList" :table-attributes="tableAttributes" :table-events="tableEvents" :operationColumnWidth="200"
-	  :options-evens-group="optionsEvensGroup" :moreParameters="moreParameters" :column-parsing="columnParsing"
-	  :operation="operation()">
-		<!-- :exportList="exportList" -->
-	  <div slot="moreSearch">
-	    <el-radio-group v-model="examineStatus" size="mini" @change="changeType">
-	    	<el-radio-button label="">全部</el-radio-button>
-	    	<el-radio-button label="WAIT">待审核</el-radio-button>
-	    	<el-radio-button label="OK">审核通过</el-radio-button>
-	    	<el-radio-button label="FAIL">驳回</el-radio-button>
-	    </el-radio-group>
-	    <br><br>
-	  </div>
-	  <el-dialog title="" width="800px" custom-class="diy-dialog" append-to-body :modal="true" :visible.sync="formDialog"
-	    :show-close="true" :close-on-click-modal="false" :modal-append-to-body="false" :before-close="formCancel">
-	    <zj-form-container ref="formRef" :form-data="formData" :styleSwitch="false">
-	      <zj-form-module :title="formDialogTitles[formDialogType]" label-width="100px" :showPackUp="false"
-	        :form-data="formData" :form-items="formItems">
-	      </zj-form-module>
-	    </zj-form-container>
-	    <div slot="footer" class="dialog-footer">
-			<el-button v-if="formData.examineStatus == 'WAIT'" size="mini" type="primary" @click="audit('OK')">审核通过</el-button>
-			<el-button v-if="formData.examineStatus == 'WAIT'" size="mini" type="danger" @click="audit('FAIL')">审核驳回</el-button>
-			<el-button size="mini" @click="formCancel">取 消</el-button>
-	    </div>
-	  </el-dialog>
-	</template-page>
+  <zj-tab-page ref="tabPage" :defaultActives="[{ key: 'list', label: '列表页面', essential: true }]">
+    <template slot-scope="{activeKey, data}">
+      <div :style="{
+        width: '100%',
+        height: activeKey == 'list' ? '100%' : '0px',
+        overflow: 'hidden'
+      }">
+        <template-page ref="pageRef" :get-list="getList" :table-attributes="tableAttributes" :table-events="tableEvents"
+          :operationColumnWidth="200" :options-evens-group="optionsEvensGroup" :moreParameters="moreParameters"
+          :column-parsing="columnParsing" :operation="operation()">
+          <div slot="moreSearch">
+            <el-radio-group v-model="examineStatus" size="mini" @change="changeType">
+              <el-radio-button label="">全部</el-radio-button>
+              <el-radio-button label="WAIT">待审核</el-radio-button>
+              <el-radio-button label="OK">审核通过</el-radio-button>
+              <el-radio-button label="FAIL">驳回</el-radio-button>
+            </el-radio-group>
+            <br><br>
+          </div>
+        </template-page>
+      </div>
+      <div v-if="~['examine', 'detail'].indexOf(activeKey)" style="box-sizing: border-box;padding: 16px;">
+        <zj-form-container ref="formRef" :form-data="formData" :styleSwitch="false">
+          <zj-form-module :title="data.label" label-width="100px" :showPackUp="false" :form-data="formData"
+            :form-items="formItems">
+          </zj-form-module>
+        </zj-form-container>
+        <div slot="footer" class="dialog-footer">
+          <el-button v-if="formData.examineStatus == 'WAIT'" size="mini" type="primary"
+            @click="audit('OK', data.removeTab)">审核通过</el-button>
+          <el-button v-if="formData.examineStatus == 'WAIT'" size="mini" type="danger"
+            @click="audit('FAIL', data.removeTab)">审核驳回</el-button>
+          <el-button size="mini" @click="data.removeTab()">取 消</el-button>
+        </div>
+      </div>
+    </template>
+  </zj-tab-page>
 </template>
 
 <script>
 import TemplatePage from '@/components/template/template-page-1.vue'
 import import_mixin from '@/components/template/import_mixin.js'
 import { required, mobileRequired, mobile } from '@/components/template/rules_verify.js'
-import { memberListPageV2,memberPageExport, getMemberDetail, memberAudit, memberInner } from "@/api/masterManagement";
+import { memberListPageV2, memberPageExport, getMemberDetail, memberAudit, memberInner } from "@/api/masterManagement";
 import operation_mixin from '@/components/template/operation_mixin.js'
 export default {
   components: { TemplatePage },
-  mixins: [import_mixin,operation_mixin],
+  mixins: [import_mixin, operation_mixin],
   data() {
     return {
       // 事件组合
@@ -53,14 +63,11 @@ export default {
       // 勾选选中行
       recordSelected: [],
       /** 表单变量 */
-      formDialogType: 0,
-      formDialogTitles: ["审核", "详情"],
-      formDialog: false,
       formData: {
-		type: '工程师',
-		examineRemark: ''
+        type: '工程师',
+        examineRemark: ''
       },
-	  examineStatus: ''
+      examineStatus: ''
     }
   },
   computed: {
@@ -73,7 +80,7 @@ export default {
         md: 12,
         isShow: true,
         name: 'el-select',
-		options: [{label: '待审核', value: 'WAIT'},{label: '驳回', value: 'FAIL'},{label: '通过', value: 'OK'}],
+        options: [{ label: '待审核', value: 'WAIT' }, { label: '驳回', value: 'FAIL' }, { label: '通过', value: 'OK' }],
         attributes: { placeholder: '请输入', disabled: true },
         formItemAttributes: {
           label: '审核状态',
@@ -124,18 +131,18 @@ export default {
         md: 12,
         isShow: true,
         name: 'slot-component',
-        attributes: { },
+        attributes: {},
         formItemAttributes: {
           label: '身份证',
           prop: 'idCardImg',
           rules: []
         },
-		render: (h, { props, onInput }) => {
-		  var { value } = props
-		  return (
-		    <el-image src={this.formData.idCardImg} style='width: 120px;height:120px' preview-src-list={[this.formData.idCardImg]} fit="fit"></el-image>
-		  )
-		}
+        render: (h, { props, onInput }) => {
+          var { value } = props
+          return (
+            <el-image src={this.formData.idCardImg} style='width: 120px;height:120px' preview-src-list={[this.formData.idCardImg]} fit="fit"></el-image>
+          )
+        }
       }, {
         md: 12,
         isShow: true,
@@ -160,7 +167,7 @@ export default {
         md: 24,
         isShow: true,
         name: 'el-input',
-        attributes: { placeholder: '请输入',type: "textarea", disabled: this.formData.examineStatus == 'WAIT' ? false:true },
+        attributes: { placeholder: '请输入', type: "textarea", disabled: this.formData.examineStatus == 'WAIT' ? false : true },
         formItemAttributes: {
           label: '备注',
           prop: 'examineRemark',
@@ -170,152 +177,154 @@ export default {
     }
   },
   methods: {
-	// 切换状态
-	changeType(val) {
-	  this.$refs.pageRef.refreshList()
-	},
+    // 切换状态
+    changeType(val) {
+      this.$refs.pageRef.refreshList()
+    },
     // 列表请求函数
-	getList(p) {
-	  try {
-	    var pam = JSON.parse(JSON.stringify(p))
-	    if (this.examineStatus) {
-	      pam.params.push({ "param": "b.examine_status", "compare": "=", "value": this.examineStatus })
-	    }
-	    return memberListPageV2(pam)
-	  } catch (error) {
-	    console.log(error)
-	  }
-	},
+    getList(p) {
+      try {
+        var pam = JSON.parse(JSON.stringify(p))
+        if (this.examineStatus) {
+          pam.params.push({ "param": "b.examine_status", "compare": "=", "value": this.examineStatus })
+        }
+        return memberListPageV2(pam)
+      } catch (error) {
+        console.log(error)
+      }
+    },
     // 列表导出函数
     exportList: memberPageExport,
     // 表格列解析渲染数据更改
     columnParsing(item, defaultData) {
-		if (item.jname === 'idCardImg') {
-		        defaultData.render = (h, { row, index, column }) => {
-		          return (
-		            <div style="padding:0 6px;cursor: pointer;">
-		              {row.idCardImg ? row.idCardImg.split(",").map(url => <el-image src={url} preview-src-list={[url]} fit="fit" style="width:80px;height:80px;" />) : null}
-		            </div>
-		          )
-		        }
-		      }
+      if (item.jname === 'idCardImg') {
+        defaultData.render = (h, { row, index, column }) => {
+          return (
+            <div style="padding:0 6px;cursor: pointer;">
+              {row.idCardImg ? row.idCardImg.split(",").map(url => <el-image src={url} preview-src-list={[url]} fit="fit" style="width:80px;height:80px;" />) : null}
+            </div>
+          )
+        }
+      }
       return defaultData
     },
     // 监听勾选变化
     selectionChange(data) {
       this.recordSelected = data
     },
-	// 表格操作列
-	operation() {
-		return this.operationBtn({
-			detail: {
-				btnType: 'text',
-				click: ({ row, index, column }) => {
-					getMemberDetail({ id: row.id }).then(res => {
-					  Object.assign(this.formData, res.data)
-					  this.formDialogType = 1
-					  this.openForm()
-					})
-				}
-			},
-			examine: {
-				btnType: 'text',
-				conditions: ({ row, index, column }) => {
-					return row.examineStatus == 'WAIT'
-				},
-				click: ({ row, index, column }) => {
-					getMemberDetail({ id: row.id }).then(res => {
-					  Object.assign(this.formData, res.data)
-					  this.formDialogType = 0
-					  this.openForm()
-					})
-				}
-			},
-			setService: {
-				btnType: 'text',
-				prompt: '请确认是否设为分销员?',
-				click: ({ row, index, column }) => {
-					memberInner({
-						type: 'SERVICE',
-						userIds: row.userId
-					}).then(res => {
-						if (res.code == 200) {
-							this.$message({ type: 'success', message: '设为分销员成功!' })
-							this.$refs.pageRef.refreshList()
-						} else {
-							this.$message.error(res.msg);
-						}
-					})
-				}
-			},
-			setCustomer: {
-				btnType: 'text',
-				prompt: '请确认是否设为客户?',
-				click: ({ row, index, column }) => {
-					memberInner({
-						type: 'GENERAL',
-						userIds: row.userId
-					}).then(res => {
-						if (res.code == 200) {
-							this.$message({ type: 'success', message: '设为客户成功!' })
-							this.$refs.pageRef.refreshList()
-						} else {
-							this.$message.error(res.msg);
-						}
-					})
-				}
-			},
-		})
-	},
-    addData() {
-      this.formDialogType = 0
-      this.openForm()
-    },
-    openForm() {
-      this.formDialog = true;
+    // 表格操作列
+    operation() {
+      return this.operationBtn({
+        detail: {
+          btnType: 'text',
+          click: ({ row, index, column }) => {
+            this.$refs.tabPage.addTab({
+              // 对应显示的模块
+              activeKey: "detail",
+              // 唯一标识
+              key: "detail",
+              // 页签名称
+              label: "编辑",
+              // 打开时事件
+              triggerEvent: () => {
+                this.guanbi()
+                this.$nextTick(() => {
+                  getMemberDetail({ id: row.id }).then(res => {
+                    Object.assign(this.formData, res.data)
+                  })
+                })
+              },
+              // 关闭时事件
+              closeEvent: () => {
+              }
+            })
+          }
+        },
+        examine: {
+          btnType: 'text',
+          conditions: ({ row, index, column }) => {
+            return row.examineStatus == 'WAIT'
+          },
+          click: ({ row, index, column }) => {
+            this.$refs.tabPage.addTab({
+              // 对应显示的模块
+              activeKey: "examine",
+              // 唯一标识
+              key: "examine",
+              // 页签名称
+              label: "审核",
+              // 打开时事件
+              triggerEvent: () => {
+                this.guanbi()
+                this.$nextTick(() => {
+                  getMemberDetail({ id: row.id }).then(res => {
+                    Object.assign(this.formData, res.data)
+                  })
+                })
+              },
+              // 关闭时事件
+              closeEvent: () => {
+              }
+            })
+          }
+        },
+        setService: {
+          btnType: 'text',
+          prompt: '请确认是否设为分销员?',
+          click: ({ row, index, column }) => {
+            memberInner({
+              type: 'SERVICE',
+              userIds: row.userId
+            }).then(res => {
+              if (res.code == 200) {
+                this.$message({ type: 'success', message: '设为分销员成功!' })
+                this.$refs.pageRef.refreshList()
+              } else {
+                this.$message.error(res.msg);
+              }
+            })
+          }
+        },
+        setCustomer: {
+          btnType: 'text',
+          prompt: '请确认是否设为客户?',
+          click: ({ row, index, column }) => {
+            memberInner({
+              type: 'GENERAL',
+              userIds: row.userId
+            }).then(res => {
+              if (res.code == 200) {
+                this.$message({ type: 'success', message: '设为客户成功!' })
+                this.$refs.pageRef.refreshList()
+              } else {
+                this.$message.error(res.msg);
+              }
+            })
+          }
+        },
+      })
     },
-    formCancel() {
-      this.$refs.formRef.$refs.inlineForm.clearValidate()
+    guanbi() {
+      this.$refs?.formRef?.$refs?.inlineForm?.clearValidate()
       this.$data.formData = this.$options.data().formData
-      this.formDialog = false
     },
-	audit(examineStatusEnum){
-		memberAudit({ 
-			examineStatusEnum,
-			examineRemark: this.formData.examineRemark,
-			id: this.formData.id
-		}).then(res => {
-			this.$message({ type: 'success', message: '审核成功!' })
-			this.formCancel()
-			this.$refs.pageRef.refreshList()
-		})
-	},
-	memberInner(type){
-		memberInner({
-			type,
-			userIds: this.formData.userId
-		}).then(res => {
-			this.$message({ type: 'success', message: '设置成功!' })
-			this.$refs.pageRef.refreshList()
-		})
-	},
-    formConfirm() {
-      this.$refs.formRef.validate((valid, invalidFields, errLabels) => {
-        if (valid) {
-          ([memberAudit][this.formDialogType])(this.formData).then(res => {
-            this.$message({ type: 'success', message: `${this.formDialogTitles[this.formDialogType]}成功!` })
-            this.formCancel()
-            this.$refs.pageRef.refreshList()
-          })
-        }
+    audit(examineStatusEnum, removeTab) {
+      memberAudit({
+        examineStatusEnum,
+        examineRemark: this.formData.examineRemark,
+        id: this.formData.id
+      }).then(res => {
+        this.$message({ type: 'success', message: '审核成功!' })
+        removeTab('list')
+        this.$refs.pageRef.refreshList()
       })
-    }
+    },
   }
 }
 </script>
 
 <style lang="scss" scoped>
-	.tab{
-		padding: 20px 20px 0 20px;
-	}
+.tab {
+  padding: 20px 20px 0 20px;
+}
 </style>

+ 41 - 105
src/views/valueAddedService/orderBranchAccount/index.vue

@@ -1,120 +1,56 @@
 <template>
-  <template-page ref="pageRef" :get-list="getList" :table-attributes="tableAttributes" :table-events="tableEvents"
-    :options-evens-group="optionsEvensGroup" :more-parameters="moreParameters" :column-parsing="columnParsing"
-    :operation="operation()" :exportList="exportList">
-    <div class="cartographer">
-      <el-dialog title="明细" width="100%" :modal="false" :visible.sync="formDialog"
-        :before-close="() => { formDialog = false }">
-        <template-page v-if="formDialog" :get-list="getList2" :columnParsing="columnParsing2" />
-      </el-dialog>
+  <zj-page-container>
+    <div class="tab">
+      <el-radio-group v-model="tabType" size="small" @change="tabTypeChange">
+        <el-radio-button label="collect">汇总</el-radio-button>
+        <el-radio-button label="offline">明细</el-radio-button>
+      </el-radio-group>
     </div>
-  </template-page>
+    <zj-page-fill>
+      <collect v-if="tabTypeCk == 'collect'" key="collect" />
+      <offline v-if="tabTypeCk == 'offline'" key="offline" :websitId="websitId" :detailParams="detailParams" />
+    </zj-page-fill>
+  </zj-page-container>
 </template>
 
 <script>
-import TemplatePage from '@/components/template/template-page-1.vue'
-import import_mixin from '@/components/template/import_mixin.js'
-import operation_mixin from '@/components/template/operation_mixin.js'
-import {
-  increOrderSettleCountList,
-  increOrderSettleCountListExport
-} from '@/api/orderBranchAccount'
-import { increOrderSettleList } from "@/api/orderSettleManag.js"
+import { EventBus } from '@/utils/eventBus'
+import collect from './pages/collect.vue'
+import offline from './pages/offline.vue'
 export default {
-  components: { TemplatePage },
-  mixins: [import_mixin,operation_mixin],
+  components: { collect, offline },
   data() {
     return {
-      // 事件组合
-      optionsEvensGroup: [],
-      // 表格属性
-      tableAttributes: {
-        // 启用勾选列
-        selectColumn: false
-      },
-      // 表格事件
-      tableEvents: {
-        'selection-change': this.selectionChange
-      },
-      // 勾选选中数据
-      recordSelected: [],
-      formDialog: false,
-      detailParams: []
+      tabType: 'collect',
+      tabTypeCk: 'collect',
+      websitId: "",
+      detailParams: [],
     }
   },
-  computed: {
-    // 更多参数
-    moreParameters() {
-      return []
-    },
+  created() {
+    EventBus.$on("orderBranchAccount", ({ websitId, detailParams, tabTypeCk }) => {
+      this.websitId = websitId
+      this.detailParams = detailParams
+      this.$nextTick(() => {
+        this.tabTypeCk = tabTypeCk
+        this.tabType = tabTypeCk
+      })
+    })
   },
   methods: {
-    // 列表请求函数
-    getList(p) {
-      this.detailParams = p.params.filter(item => item.param === "a.pay_time")
-      return increOrderSettleCountList(p)
-    },
-    // 列表导出函数
-    exportList: increOrderSettleCountListExport,
-    // 表格列解析渲染数据更改
-    columnParsing(item, defaultData) {
-      return defaultData
-    },
-    // 监听勾选变化
-    selectionChange(data) {
-      this.recordSelected = data
-    },
-	// 表格操作列
-	operation() {
-		return this.operationBtn({
-			detail: {
-				btnType: 'text',
-				click: ({ row, index, column }) => {
-					this.detailParams = [...this.detailParams.filter(item => item.param === "a.pay_time"), {
-					  param: "a.websit_id",
-					  compare: "=",
-					  value: row.websitId
-					}];
-					this.$nextTick(() => {
-					  this.formDialog = true
-					})
-				}
-			}
-		})
-	},
-    // 明细列表
-    getList2(p) {
-      var pam = JSON.parse(JSON.stringify(p))
-      pam.params = [...pam.params, ...this.detailParams,]
-      try {
-        return increOrderSettleList(pam)
-      } catch (err) {
-      }
-    },
-    // 表格列解析渲染数据更改
-    columnParsing2(item, defaultData) {
-      if (item.jname === 'residuNum') {
-        defaultData.render = (h, { row, index, column }) => {
-          return (
-            <div style="padding:0 6px;cursor: pointer;">
-              {row["increType"] != 1 ? row["residuNum"] : ""}
-            </div>
-          )
-        }
-      }
-      if (item.jname === 'serviceEndTime') {
-        defaultData.render = (h, { row, index, column }) => {
-          return (
-            <div style="padding:0 6px;cursor: pointer;">
-              {row[column.columnAttributes.prop] ? row[column.columnAttributes.prop].split(" ")[0] : ""}
-            </div>
-          )
-        }
-      }
-      return defaultData
-    },
-  }
+    tabTypeChange() {
+      this.websitId = ""
+      this.detailParams = []
+      this.$nextTick(() => {
+        this.tabTypeCk = this.tabType
+      })
+    }
+  },
 }
 </script>
 
-<style lang="scss" scoped></style>
+<style lang="scss" scoped>
+.tab {
+  padding: 20px 20px 0 20px;
+}
+</style>

+ 73 - 0
src/views/valueAddedService/orderBranchAccount/pages/collect.vue

@@ -0,0 +1,73 @@
+<template>
+  <template-page ref="pageRef" :getList="getList" :operation="operation()" :exportList="exportList"
+    :columnParsing="columnParsing" :tableAttributes="tableAttributes" :tableEvents="tableEvents">
+  </template-page>
+</template>
+
+<script>
+import TemplatePage from '@/components/template/template-page-1.vue'
+import import_mixin from '@/components/template/import_mixin.js'
+import operation_mixin from '@/components/template/operation_mixin.js'
+import {
+  increOrderSettleCountList,
+  increOrderSettleCountListExport
+} from '@/api/orderBranchAccount'
+import { EventBus } from '@/utils/eventBus'
+export default {
+  components: {
+    TemplatePage,
+  },
+  mixins: [import_mixin, operation_mixin],
+  data() {
+    return {
+      formBool: false,
+      // 表格属性
+      tableAttributes: {
+        // 启用勾选列
+        selectColumn: false,
+      },
+      // 表格事件
+      tableEvents: {
+        'selection-change': this.selectionChange
+      },
+      formData: {},
+      detailParams: []
+    }
+  },
+  methods: {
+    // 列表请求函数
+    getList(p) {
+      this.detailParams = p.params.filter(item => item.param === "a.pay_time")
+      return increOrderSettleCountList(p)
+    },
+
+    // 列表导出函数
+    exportList: increOrderSettleCountListExport,
+
+    // 表格列解析渲染数据更改
+    columnParsing(item, defaultData) {
+      return defaultData
+    },
+
+    // 监听勾选变化
+    selectionChange(data) {
+      this.recordSelected = data
+    },
+
+    operation() {
+      return this.operationBtn({
+        detail: {
+          btnType: 'text',
+          click: ({ row, index, column }) => {
+            var { websitId } = row
+            EventBus.$emit("orderBranchAccount", { websitId, detailParams: this.detailParams, tabTypeCk: "offline" })
+          }
+        },
+      })
+    },
+
+  }
+}
+</script>
+
+<style lang="scss" scoped></style>

+ 88 - 0
src/views/valueAddedService/orderBranchAccount/pages/offline.vue

@@ -0,0 +1,88 @@
+<template>
+  <template-page ref="pageRef" :getList="getList" :exportList="exportList" :columnParsing="columnParsing"
+    :tableAttributes="tableAttributes" :tableEvents="tableEvents">
+  </template-page>
+</template>
+
+<script>
+import TemplatePage from '@/components/template/template-page-1.vue'
+import import_mixin from '@/components/template/import_mixin.js'
+import operation_mixin from '@/components/template/operation_mixin.js'
+import { increOrderSettleList2, increOrderSettleListExport2 } from "@/api/orderSettleManag.js"
+export default {
+  components: {
+    TemplatePage,
+  },
+  mixins: [import_mixin, operation_mixin],
+  props: {
+    websitId: {
+      type: [String, Number],
+      default: ""
+    },
+    detailParams: {
+      type: Array,
+      default: () => []
+    },
+  },
+  data() {
+    return {
+      formBool: false,
+      // 表格属性
+      tableAttributes: {
+        // 启用勾选列
+        selectColumn: false,
+      },
+      // 表格事件
+      tableEvents: {
+        'selection-change': this.selectionChange
+      },
+    }
+  },
+  methods: {
+    // 列表请求函数
+    getList(p, cb) {
+      try {
+        var pam = JSON.parse(JSON.stringify(p))
+        if (this.websitId) {
+          pam.params.push({ "param": "websit_id", "compare": "=", "value": this.websitId })
+        }
+        if (this.detailParams.length) {
+          pam.params = [...pam.params.filter(item => item.param !== "a.pay_time"), ...this.detailParams,]
+        }
+        return increOrderSettleList2(pam)
+      } catch (err) {
+        console.log(err)
+      }
+    },
+
+    exportList: increOrderSettleListExport2,
+
+    // 表格列解析渲染数据更改
+    columnParsing(item, defaultData) {
+      return defaultData
+    },
+
+    // 监听勾选变化
+    selectionChange(data) {
+      this.recordSelected = data
+    },
+
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.neibuview {
+  box-sizing: border-box;
+  padding-left: 16px;
+
+  ::v-deep &>.zj-page-fill-scroll {
+    box-sizing: border-box;
+    padding-right: 16px;
+
+    &>div:nth-child(1) {
+      margin-top: 20px;
+    }
+  }
+}
+</style>

+ 56 - 0
src/views/valueAddedService/orderMasterSplitAccount/index.vue

@@ -0,0 +1,56 @@
+<template>
+  <zj-page-container>
+    <div class="tab">
+      <el-radio-group v-model="tabType" size="small" @change="tabTypeChange">
+        <el-radio-button label="collect">汇总</el-radio-button>
+        <el-radio-button label="offline">明细</el-radio-button>
+      </el-radio-group>
+    </div>
+    <zj-page-fill>
+      <collect v-if="tabTypeCk == 'collect'" key="collect" />
+      <offline v-if="tabTypeCk == 'offline'" key="offline" :workerId="workerId" :detailParams="detailParams" />
+    </zj-page-fill>
+  </zj-page-container>
+</template>
+
+<script>
+import { EventBus } from '@/utils/eventBus'
+import collect from './pages/collect.vue'
+import offline from './pages/offline.vue'
+export default {
+  components: { collect, offline },
+  data() {
+    return {
+      tabType: 'collect',
+      tabTypeCk: 'collect',
+      workerId: "",
+      detailParams: [],
+    }
+  },
+  created() {
+    EventBus.$on("orderMasterSplitAccount", ({ workerId, detailParams, tabTypeCk }) => {
+      this.workerId = workerId
+      this.detailParams = detailParams
+      this.$nextTick(() => {
+        this.tabTypeCk = tabTypeCk
+        this.tabType = tabTypeCk
+      })
+    })
+  },
+  methods: {
+    tabTypeChange() {
+      this.workerId = ""
+      this.detailParams = []
+      this.$nextTick(() => {
+        this.tabTypeCk = this.tabType
+      })
+    }
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.tab {
+  padding: 20px 20px 0 20px;
+}
+</style>

+ 73 - 0
src/views/valueAddedService/orderMasterSplitAccount/pages/collect.vue

@@ -0,0 +1,73 @@
+<template>
+  <template-page ref="pageRef" :getList="getList" :operation="operation()" :exportList="exportList"
+    :columnParsing="columnParsing" :tableAttributes="tableAttributes" :tableEvents="tableEvents">
+  </template-page>
+</template>
+
+<script>
+import TemplatePage from '@/components/template/template-page-1.vue'
+import import_mixin from '@/components/template/import_mixin.js'
+import operation_mixin from '@/components/template/operation_mixin.js'
+import {
+  increOrderSettleCountWorkerList,
+  increOrderSettleCountWorkerListExport
+} from '@/api/orderSettleManag'
+import { EventBus } from '@/utils/eventBus'
+export default {
+  components: {
+    TemplatePage,
+  },
+  mixins: [import_mixin, operation_mixin],
+  data() {
+    return {
+      formBool: false,
+      // 表格属性
+      tableAttributes: {
+        // 启用勾选列
+        selectColumn: false,
+      },
+      // 表格事件
+      tableEvents: {
+        'selection-change': this.selectionChange
+      },
+      formData: {},
+      detailParams: []
+    }
+  },
+  methods: {
+    // 列表请求函数
+    getList(p) {
+      this.detailParams = p.params.filter(item => item.param === "a.pay_time")
+      return increOrderSettleCountWorkerList(p)
+    },
+
+    // 列表导出函数
+    exportList: increOrderSettleCountWorkerListExport,
+
+    // 表格列解析渲染数据更改
+    columnParsing(item, defaultData) {
+      return defaultData
+    },
+
+    // 监听勾选变化
+    selectionChange(data) {
+      this.recordSelected = data
+    },
+
+    operation() {
+      return this.operationBtn({
+        detail: {
+          btnType: 'text',
+          click: ({ row, index, column }) => {
+            var { workerId } = row
+            EventBus.$emit("orderMasterSplitAccount", { workerId, detailParams: this.detailParams, tabTypeCk: "offline" })
+          }
+        },
+      })
+    },
+
+  }
+}
+</script>
+
+<style lang="scss" scoped></style>

+ 88 - 0
src/views/valueAddedService/orderMasterSplitAccount/pages/offline.vue

@@ -0,0 +1,88 @@
+<template>
+  <template-page ref="pageRef" :getList="getList" :exportList="exportList" :columnParsing="columnParsing"
+    :tableAttributes="tableAttributes" :tableEvents="tableEvents">
+  </template-page>
+</template>
+
+<script>
+import TemplatePage from '@/components/template/template-page-1.vue'
+import import_mixin from '@/components/template/import_mixin.js'
+import operation_mixin from '@/components/template/operation_mixin.js'
+import { increOrderSettleList2, increOrderSettleListExport2 } from "@/api/orderSettleManag.js"
+export default {
+  components: {
+    TemplatePage,
+  },
+  mixins: [import_mixin, operation_mixin],
+  props: {
+    workerId: {
+      type: [String, Number],
+      default: ""
+    },
+    detailParams: {
+      type: Array,
+      default: () => []
+    },
+  },
+  data() {
+    return {
+      formBool: false,
+      // 表格属性
+      tableAttributes: {
+        // 启用勾选列
+        selectColumn: false,
+      },
+      // 表格事件
+      tableEvents: {
+        'selection-change': this.selectionChange
+      },
+    }
+  },
+  methods: {
+    // 列表请求函数
+    getList(p, cb) {
+      try {
+        var pam = JSON.parse(JSON.stringify(p))
+        if (this.workerId) {
+          pam.params.push({ "param": "worker_id", "compare": "=", "value": this.workerId })
+        }
+        if (this.detailParams.length) {
+          pam.params = [...pam.params.filter(item => item.param !== "a.pay_time"), ...this.detailParams,]
+        }
+        return increOrderSettleList2(pam)
+      } catch (err) {
+        console.log(err)
+      }
+    },
+
+    exportList: increOrderSettleListExport2,
+
+    // 表格列解析渲染数据更改
+    columnParsing(item, defaultData) {
+      return defaultData
+    },
+
+    // 监听勾选变化
+    selectionChange(data) {
+      this.recordSelected = data
+    },
+
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.neibuview {
+  box-sizing: border-box;
+  padding-left: 16px;
+
+  ::v-deep &>.zj-page-fill-scroll {
+    box-sizing: border-box;
+    padding-right: 16px;
+
+    &>div:nth-child(1) {
+      margin-top: 20px;
+    }
+  }
+}
+</style>

+ 25 - 462
src/views/valueAddedService/orderSettleManag/index.vue

@@ -1,479 +1,42 @@
 <template>
-  <template-page ref="pageRef" :get-list="getList" :exportList="exportList" :table-attributes="tableAttributes"
-    :table-events="tableEvents" :moreParameters="moreParameters" :column-parsing="columnParsing" :operation="operation()"
-    :operationColumnWidth="200" :optionsEvensGroup="optionsEvensGroup">
-    <div class="cartographer">
-      <el-dialog :title="formTypeName[formType]" width="100%" :modal="false" :visible.sync="formDialog"
-        :before-close="formCancel">
-        <zj-form-container v-if="formDialog" ref="formRef" :form-data="formData" :styleSwitch="false">
-          <zj-form-module title="基础信息" label-width="120px" :showPackUp="false" :form-data="formData"
-            :form-items="formItems">
-          </zj-form-module>
-          <zj-form-module title="订单信息" label-width="120px" :showPackUp="false" :form-data="formData"
-            :form-items="formItemsList">
-          </zj-form-module>
-          <zj-form-module title="附件图片" label-width="120px" :showPackUp="false" :form-data="formData"
-            :form-items="formItemsImgs">
-          </zj-form-module>
-        </zj-form-container>
-        <div slot="footer" v-if="formType" class="dialog-footer">
-          <el-button size="mini" @click="formCancel">取 消</el-button>
-          <el-button size="mini" @click="formConfirm" type="primary">确定</el-button>
-        </div>
-      </el-dialog>
+  <zj-page-container>
+    <div class="tab">
+      <el-radio-group v-model="tabType" size="small" @change="tabTypeChange">
+        <el-radio-button label="collect">线上订单</el-radio-button>
+        <el-radio-button label="offline">线下订单</el-radio-button>
+      </el-radio-group>
     </div>
-  </template-page>
+    <zj-page-fill>
+      <collect v-if="tabTypeCk == 'collect'" key="collect" />
+      <offline v-if="tabTypeCk == 'offline'" key="offline" />
+    </zj-page-fill>
+  </zj-page-container>
 </template>
 
 <script>
-import TemplatePage from '@/components/template/template-page-1.vue'
-import import_mixin from '@/components/template/import_mixin.js'
-import { increOrderSettleList, increOrderSettleListExport, increOrderSettleDetail, increOrderSettleConfirm, increOrderSettleRefund } from "@/api/orderSettleManag.js"
-import ImageUpload from '@/components/file-upload'
-import operation_mixin from '@/components/template/operation_mixin.js'
+import { EventBus } from '@/utils/eventBus'
+import collect from './pages/collect.vue'
+import offline from './pages/offline.vue'
 export default {
-  props: {
-    storageType: {
-      type: String,
-      default: ""
-    }
-  },
-  components: { TemplatePage, ImageUpload },
-  mixins: [import_mixin, operation_mixin],
+  components: { collect, offline },
   data() {
     return {
-      // 表格属性
-      tableAttributes: {
-        // 启用勾选列
-        selectColumn: true,
-        selectable: this.selectable
-      },
-      // 表格事件
-      tableEvents: {
-        'selection-change': this.selectionChange
-      },
-      // 勾选选中数据
-      recordSelected: [],
-      formTypeName: ["查看", "结算"],
-      formType: -1,
-      formData: {
-        pgIncreItems: []
-      },
-      formDialog: false,
+      tabType: 'collect',
+      tabTypeCk: 'collect',
     }
   },
-  computed: {
-    // 事件组合
-    optionsEvensGroup() {
-      return [
-        [
-          [
-            this.optionsEvensAuth("bulkSettlemen", {
-              click: () => {
-                if (this.recordSelected.length === 0) {
-                  this.$message.warning('请勾选订单')
-                  return
-                }
-                increOrderSettleConfirm(this.recordSelected.map(item => item.id)).then(res => {
-                  this.$message({ type: 'success', message: `成功!` })
-                  this.$refs.pageRef.refreshList()
-                })
-              }
-            })
-          ],
-        ]
-      ]
-    },
-    // 更多参数
-    moreParameters() {
-      return [
-        {
-          name: '支付状态',
-          key: 'payStatus',
-          value: '',
-          conditions: [
-            {
-              label: "全部",
-              value: ""
-            }, {
-              label: "已支付",
-              value: "PAID"
-            }, {
-              label: "待支付",
-              value: "WAIT"
-            }, {
-              label: "已退款",
-              value: "REFUND"
-            }, {
-              label: "过期",
-              value: "EXPIRE"
-            }, {
-              label: "取消",
-              value: "CANCEL"
-            }]
-        },
-      ]
-    },
-    formItems() {
-      return [{
-        md: 24,
-        isShow: true,
-        name: 'slot-component',
-        formItemAttributes: {
-          label: '',
-          prop: '',
-          'label-width': '0px'
-        },
-        render: (h, { props, onInput }) => {
-          var { value } = props
-          return (
-            <div>
-              <el-descriptions border title="" column={2} colon={false} labelStyle={{ width: '10%' }} contentStyle={{ width: '40%' }}>
-                <el-descriptions-item label="所属商户">
-                  {this.formData.companyWechatName}
-                </el-descriptions-item>
-                <el-descriptions-item label="销售网点">
-                  {this.formData.websitName}
-                </el-descriptions-item>
-                <el-descriptions-item label="订单单号" >
-                  {this.formData.id}
-                </el-descriptions-item>
-                <el-descriptions-item label="师傅姓名" >
-                  {this.formData.workerName}
-                </el-descriptions-item>
-                <el-descriptions-item label="师傅联系电话">
-                  {this.formData.workerMobile}
-                </el-descriptions-item>
-                <el-descriptions-item label="师傅身份证号">
-                  {this.formData.workerIdcard}
-                </el-descriptions-item>
-                <el-descriptions-item label="客户姓名" >
-                  {this.formData.userName}
-                </el-descriptions-item>
-                <el-descriptions-item label="客户电话" >
-                  {this.formData.userMobile}
-                </el-descriptions-item>
-                <el-descriptions-item label="详细地址">
-                  {this.formData.userAddress}
-                </el-descriptions-item>
-                <el-descriptions-item label="内机条码">
-                  {this.formData.insideCode}
-                </el-descriptions-item>
-                <el-descriptions-item label="服务单号" >
-                  {this.formData.serviceNo}
-                </el-descriptions-item>
-                <el-descriptions-item label="发票价格" >
-                  {this.formData.invoiceAmount}
-                </el-descriptions-item>
-                <el-descriptions-item label="发票时间">
-                  {this.formData.invoiceTime}
-                </el-descriptions-item>
-                <el-descriptions-item label="服务截止时间">
-                  {this.formData.serviceEndTime}
-                </el-descriptions-item>
-                <el-descriptions-item label="创建人" >
-                  {this.formData.createBy}
-                </el-descriptions-item>
-                <el-descriptions-item label="创建时间" >
-                  {this.formData.createTime}
-                </el-descriptions-item>
-                <el-descriptions-item label="支付状态">
-                  {({ "EXPIRE": "过期", "CANCEL": "取消", "PAID": "已支付", "WAIT": "待支付", "REFUND": "已退款" })[this.formData.payStatus] || ""}
-                </el-descriptions-item>
-                <el-descriptions-item label="支付方式">
-                  {({ 1: "扫码支付", 2: "代客支付" })[this.formData.payType] || ""}
-                </el-descriptions-item>
-                <el-descriptions-item label="支付订单号" >
-                  {this.formData.payNo}
-                </el-descriptions-item>
-                <el-descriptions-item label="支付时间" >
-                  {this.formData.payTime}
-                </el-descriptions-item>
-                <el-descriptions-item label="微信流水号">
-                  {this.formData.transcationId}
-                </el-descriptions-item>
-                <el-descriptions-item label="师傅销售佣金">
-                  {this.formData.workerAmount}
-                </el-descriptions-item>
-                <el-descriptions-item label="结算人员" >
-                  {this.formData.updateBy}
-                </el-descriptions-item>
-                <el-descriptions-item label="操作时间" >
-                  {this.formData.updateTime}
-                </el-descriptions-item>
-              </el-descriptions>
-            </div>
-          )
-        }
-      }]
-    },
-    formItemsList() {
-      return [{
-        md: 24,
-        isShow: true,
-        name: 'slot-component',
-        formItemAttributes: {
-          label: '',
-          prop: '',
-          'label-width': '0px'
-        },
-        render: (h, { props, onInput }) => {
-          var { value } = props
-          return (
-            <zj-table
-              columns={[{
-                columnAttributes: {
-                  label: '服务类型',
-                  prop: 'type'
-                },
-                render: (h, { row, column, index }) => {
-                  return <div style="padding: 0 10px">
-                    {({ 1: "延保", 2: "清洗" })[row.type] || ""}
-                  </div>
-                }
-              },
-              {
-                columnAttributes: {
-                  label: '使用类型',
-                  prop: 'usedType'
-                },
-                render: (h, { row, column, index }) => {
-                  return <div style="padding: 0 10px">
-                    {({ COUNT: "使用次数", YEAR: "使用年限" })[row.usedType] || ""}
-                  </div>
-                }
-              }, {
-                columnAttributes: {
-                  label: '品牌',
-                  prop: 'brandName'
-                }
-              },
-              {
-                columnAttributes: {
-                  label: '产品大类',
-                  prop: 'mainName'
-                }
-              },
-              {
-                columnAttributes: {
-                  label: '服务内容',
-                  prop: 'content'
-                }
-              },
-              {
-                columnAttributes: {
-                  label: '服务金额(元)',
-                  prop: 'amount'
-                }
-              },
-              {
-                columnAttributes: {
-                  label: '使用限值',
-                  prop: 'limitNum'
-                }
-              },
-              {
-                columnAttributes: {
-                  label: '总手续费',
-                  prop: 'commissionAmount'
-                }
-              },
-              {
-                columnAttributes: {
-                  label: '师傅分成金额',
-                  prop: 'workerAmount'
-                }
-              },
-              {
-                columnAttributes: {
-                  label: '网点分成金额',
-                  prop: 'websitAmount'
-                }
-              }]}
-              tableData={[{
-                ...(this.formData.increItem || {}),
-                ...(this.formData.incre || {}),
-                workerAmount: this.formData.workerAmount,
-                websitAmount: this.formData.websitAmount,
-                commissionAmount: this.formData.commissionAmount
-              }]}
-              tableAttributes={{
-                size: 'mini',
-                border: true,
-              }} />
-          )
-        }
-      }]
-    },
-    formItemsImgs() {
-      return [{
-        md: 24,
-        name: 'slot-component',
-        formItemAttributes: {
-          label: '',
-          prop: '',
-          'label-width': '0px'
-        },
-        render: (h, { props, onInput }) => {
-          return (
-            <ImageUpload
-              fileList={
-                [{ key: "insideCodeImg", name: "内机条码" }, { key: "machineImg", name: "机器铭牌图片" }, { key: "buyCertImg", name: "购机凭证图片" }].map((item) => ({ url: this.formData[item.key], name: item.name }))
-              }
-              limit={1000}
-              isEdit={false}
-              viewOnline={false}
-              download={false}
-              showName={true}
-            />
-          )
-        }
-      }]
-    },
-  },
-	created(){
-		if(this.$route.query.id){
-			this.formType = 0
-			this.getDetail(this.$route.query.id)
-		}
-	},
   methods: {
-    selectable(row, index) {
-      return ["PAID"].includes(Object.entries(row.selectMapData.payStatus).find(([key, val]) => val == row.payStatus)?.[0]) &&
-        ["ING"].includes(Object.entries(row.selectMapData.settleStatus).find(([key, val]) => val == row.settleStatus)?.[0])
-    },
-    // 列表请求函数
-    getList(p, cb) {
-      var pam = JSON.parse(JSON.stringify(p))
-      try {
-        if (pam.payStatus) {
-          pam.params.push({ "param": "a.pay_status", "compare": "=", "value": pam.payStatus })
-        }
-        cb && cb(pam)
-        return increOrderSettleList(pam)
-      } catch (err) {
-      }
-    },
-    // 列表导出函数
-    exportList: increOrderSettleListExport,
-    // 表格列解析渲染数据更改
-    columnParsing(item, defaultData) {
-      if (item.jname === 'residuNum') {
-        defaultData.render = (h, { row, index, column }) => {
-          return (
-            <div style="padding:0 6px;cursor: pointer;">
-              {row["increType"] != 1 ? row["residuNum"] : ""}
-            </div>
-          )
-        }
-      }
-      if (item.jname === 'serviceEndTime') {
-        defaultData.render = (h, { row, index, column }) => {
-          return (
-            <div style="padding:0 6px;cursor: pointer;">
-              {row[column.columnAttributes.prop] ? row[column.columnAttributes.prop].split(" ")[0] : ""}
-            </div>
-          )
-        }
-      }
-      return defaultData
-    },
-    // 监听勾选变化
-    selectionChange(data) {
-      this.recordSelected = data
-    },
-    // 表格操作列
-    operation() {
-      return this.operationBtn({
-        detail: {
-          btnType: 'text',
-          click: ({ row, index, column }) => {
-            this.formType = 0
-            this.getDetail(row.id)
-          }
-        },
-        orderDetail: {
-          btnType: 'text',
-          conditions: ({ row, index, column }) => {
-            return ["PAID", "REFUND"].includes(row.payStatus)
-          },
-          click: ({ row, index, column }) => {
-            this.$router.push({
-              name: "workOrderPool",
-              query: {
-                pgIncreItemId: row.id,
-              }
-            })
-          }
-        },
-        refund: {
-          btnType: 'text',
-          prompt: '是否确定退款?',
-          conditions: ({ row, index, column }) => {
-            return ["PAID"].includes(row.payStatus) && ["ING"].includes(row.settleStatus) && (() => {
-              var currentDate = new Date(row.payTime);
-              currentDate.setDate(currentDate.getDate() + 7);
-              currentDate.setHours(23);
-              currentDate.setMinutes(59);
-              currentDate.setSeconds(59);
-              return currentDate > new Date()
-            })()
-          },
-          click: ({ row, index, column }) => {
-            increOrderSettleRefund({ id: row.id }).then(res => {
-              this.$message({ type: 'success', message: `退款成功!` })
-              this.$refs.pageRef.refreshList()
-            })
-          }
-        },
-        settlement: {
-          btnType: 'text',
-          prompt: '是否确定结算?',
-          conditions: ({ row, index, column }) => {
-            return ["PAID"].includes(row.payStatus) && ["ING"].includes(row.settleStatus)
-          },
-          click: ({ row, index, column }) => {
-            this.formType = 1
-            this.getDetail(row.id)
-          }
-        },
-      })
-    },
-    getDetail(id) {
-      increOrderSettleDetail({ id }).then(res => {
-        Object.assign(this.formData, res.data)
-        this.openForm()
+    tabTypeChange() {
+      this.$nextTick(() => {
+        this.tabTypeCk = this.tabType
       })
-    },
-    openForm() {
-      this.formDialog = true
-    },
-    // 关闭弹窗
-    formCancel() {
-      this.$refs.formRef.$refs.inlineForm.clearValidate()
-      this.$data.formData = this.$options.data().formData
-      this.formDialog = false
-    },
-    formConfirm() {
-      this.$refs.formRef.validate((valid, invalidFields, errLabels) => {
-        if (valid) {
-          increOrderSettleConfirm([this.formData.id]).then(res => {
-            this.$message({ type: 'success', message: `操作成功!` })
-            this.formCancel()
-            this.$refs.pageRef.refreshList()
-          })
-        }
-      })
-    },
-  }
+    }
+  },
 }
 </script>
 
-<style lang="scss">
-.redbordererr {
-  .el-form-item {
-    margin: 0 !important;
-    overflow: hidden;
-  }
+<style lang="scss" scoped>
+.tab {
+  padding: 20px 20px 0 20px;
 }
 </style>

+ 293 - 0
src/views/valueAddedService/orderSettleManag/mixins/basicInfo.js

@@ -0,0 +1,293 @@
+import { lbsAmapRegion } from '@/api/common.js'
+import { listPageV2, getDetail } from "@/api/engineeringMaintenance/basicData";
+import geographicalPosi from '@/components/geographicalPosi/index.vue'
+import { required, mobileRequired, mobile, httpUrl, email } from '@/components/template/rules_verify.js'
+export default {
+  data() {
+    return {
+      provinceList: [],
+      cityList: [],
+      areaList: [],
+      streetList: [],
+    }
+  },
+  computed: {
+    // 基本信息数据模型
+    basicInfo() {
+      return [
+        {
+          name: 'el-input',
+          md: 6,
+          attributes: { disabled: false, placeholder: '请输入' },
+          formItemAttributes: {
+            label: '客户名称',
+            prop: 'userName',
+            rules: [...required]
+          },
+          events: {
+            input: (v) => {
+              this.addFormData.linkName = v
+            }
+          }
+        },
+        {
+          name: 'el-input',
+          md: 6,
+          attributes: { disabled: false, placeholder: '请输入', maxlength: 11 },
+          formItemAttributes: {
+            label: '客户电话',
+            prop: 'userMobile',
+            rules: [...mobileRequired]
+          }
+        },
+        {
+          name: 'slot-component',
+          md: 12,
+          formItemAttributes: {
+            'label-width': '0px',
+            prop: '',
+          },
+          render: (h, { props }) => {
+            return null
+          }
+        },
+        // {
+        //   name: 'el-select',
+        //   md: 6,
+        //   formItemAttributes: {
+        //     label: '客户地址', //省
+        //     prop: 'provinceId',
+        //     rules: [required],
+        //     errLabel: '省'
+        //   },
+        //   options: this.provinceList.map((v, i) => ({ value: v.id, label: v.name })),
+        //   attributes: { disabled: true, clearable: true, filterable: true, placeholder: '请选择' },
+        //   events: {
+        //     change: () => {
+        //       // 获取省名称
+        //       this.addFormData.province = this.provinceList.find(item => item.id === val)?.name || ''
+        //       // 清除市区街道以及详细地址数据
+        //       this.delDataK(1)
+        //       lbsAmapRegion({ pid: val }).then(res => {
+        //         this.cityList = res.data
+        //       })
+        //     }
+        //   }
+        // },
+        // {
+        //   name: 'el-select',
+        //   md: 5,
+        //   formItemAttributes: {
+        //     'label-width': '0px',
+        //     label: '', //市
+        //     prop: 'cityId',
+        //     rules: [required],
+        //     errLabel: '市'
+        //   },
+        //   options: this.cityList.map((v, i) => ({ value: v.id, label: v.name })),
+        //   attributes: { disabled: true, clearable: true, filterable: true, placeholder: '请选择' },
+        //   events: {
+        //     change: () => {
+        //       // 获取市名称
+        //       this.addFormData.city = this.cityList.find(item => item.id === val).name
+        //       // 清除区街道以及详细地址数据
+        //       this.delDataK(2)
+        //       lbsAmapRegion({ pid: val }).then(res => {
+        //         this.areaList = res.data
+        //       })
+        //     }
+        //   }
+        // },
+        // {
+        //   name: 'el-select',
+        //   md: 5,
+        //   formItemAttributes: {
+        //     'label-width': '0px',
+        //     label: '', //区
+        //     prop: 'areaId',
+        //     rules: [required],
+        //     errLabel: '区'
+        //   },
+        //   options: this.areaList.map((v, i) => ({ value: v.id, label: v.name })),
+        //   attributes: { disabled: true, clearable: true, filterable: true, placeholder: '请选择' },
+        //   events: {
+        //     change: () => {
+        //       // 获取区名称
+        //       this.addFormData.area = this.areaList.find(item => item.id === val).name
+        //       // 清除街道以及详细地址数据
+        //       this.delDataK(3)
+        //       lbsAmapRegion({ pid: val }).then(res => {
+        //         this.streetList = res.data
+        //       })
+        //     }
+        //   }
+        // },
+        // {
+        //   name: 'el-select',
+        //   md: 5,
+        //   formItemAttributes: {
+        //     'label-width': '0px',
+        //     label: '', //街道
+        //     prop: 'streetId',
+        //     rules: [required],
+        //     errLabel: '街道'
+        //   },
+        //   options: this.streetList.map((v, i) => ({ value: v.id, label: v.name })),
+        //   attributes: { disabled: true, clearable: true, filterable: true, placeholder: '请选择' },
+        //   events: {
+        //     change: () => {
+        //       // 获取街道名称
+        //       this.addFormData.street = this.streetList.find(item => item.id === val).name
+        //       // 清除详细地址数据
+        //       this.delDataK(4)
+        //     }
+        //   }
+        // },
+        {
+          name: 'el-input',
+          md: 21,
+          formItemAttributes: { label: '客户地址', prop: 'userAddress', rules: [...required] },
+          attributes: { disabled: false, placeholder: '详细地址' }
+        },
+        {
+          name: 'slot-component',
+          md: 3,
+          formItemAttributes: {
+            'label-width': '0px',
+            prop: '',
+          },
+          render: (h, { props }) => {
+            return (
+              <geographicalPosi
+                disabled={false}
+                formData={this.addFormData}
+                onSelectPosi={data => {
+                  // 赋值GPS详细地址
+                  this.addFormData.userAddress = data.name
+                  this.$refs?.addFormRef?.$refs?.inlineForm?.clearValidate(["userAddress"])
+                  // // 获取经纬度
+                  // this.addFormData.lng = data.center[0]
+                  // this.addFormData.lat = data.center[1]
+                  // // 获取定位的省市区街道
+                  // var { province, city, district, township } = data.data.addressComponent
+                  // // 获取选中省名称id
+                  // var { id, name } = this.provinceList.find(item => item.name === province)
+                  // this.addFormData.provinceId = id
+                  // this.addFormData.province = name
+                  // // 请求市选项
+                  // lbsAmapRegion({ pid: this.addFormData.provinceId }).then(res => {
+                  //   // 赋值市选项
+                  //   this.cityList = res.data
+                  //   // 获取选中市名称id
+                  //   var { id, name } = res.data.find(item => item.name === city)
+                  //   this.addFormData.cityId = id
+                  //   this.addFormData.city = name
+                  //   // 请求区选项
+                  //   lbsAmapRegion({ pid: this.addFormData.cityId }).then(res => {
+                  //     // 赋值区选项
+                  //     this.areaList = res.data
+                  //     // 获取选中区名称id
+                  //     var { id, name } = res.data.find(item => item.name === district)
+                  //     this.addFormData.areaId = id
+                  //     this.addFormData.area = name
+                  //     // 请求街道选项
+                  //     lbsAmapRegion({ pid: this.addFormData.areaId }).then(res => {
+                  //       // 赋值街道选项
+                  //       this.streetList = res.data
+                  //       // 获取选中街道名称id
+                  //       var { id, name } = res.data.find(item => item.name === township)
+                  //       this.addFormData.streetId = id
+                  //       this.addFormData.street = name
+                  //       // 赋值GPS详细地址
+                  //       this.addFormData.userAddress = data.name
+                  //     })
+                  //   })
+                  // })
+                }}
+              />
+            )
+          }
+        },
+        {
+          name: 'el-input',
+          md: 24,
+          attributes: {
+            disabled: false,
+            type: 'textarea',
+            rows: 3,
+            placeholder: '请输入'
+          },
+          formItemAttributes: {
+            label: '备注',
+            prop: 'remark',
+            rules: []
+          }
+        }
+      ]
+    }
+  },
+  methods: {
+    getinitlbslist() {
+      // 初始化请求省市区街道下拉选项数据
+      lbsAmapRegion({ pid: 0 }).then(res => {
+        this.provinceList = res.data
+        // 创建工单时获取ip地址定位赋值
+        if (!this.addFormData.id && this.$IpAdd.province) {
+          var item = this.provinceList.find(item => item.name === this.$IpAdd.province)
+          if (item) {
+            this.addFormData.provinceId = item.id
+            this.addFormData.province = item.name
+          }
+        }
+        if (this.addFormData.provinceId) {
+          lbsAmapRegion({ pid: this.addFormData.provinceId }).then(res => {
+            this.cityList = res.data
+            // 创建工单时获取ip地址定位赋值
+            if (!this.id && this.$IpAdd.city) {
+              var item2 = this.cityList.find(item => item.name === this.$IpAdd.city)
+              if (item2) {
+                this.addFormData.cityId = item2.id
+                this.addFormData.city = item2.name
+              }
+            }
+            if (this.addFormData.cityId) {
+              lbsAmapRegion({ pid: this.addFormData.cityId }).then(res => {
+                this.areaList = res.data
+              })
+            }
+            if (this.addFormData.areaId) {
+              lbsAmapRegion({ pid: this.addFormData.areaId }).then(res => {
+                this.streetList = res.data
+              })
+            }
+          })
+        }
+      })
+    },
+    delDataK(num) {
+      if (num <= 1) {
+        // 删除市
+        this.addFormData.cityId = ''
+        this.addFormData.city = ''
+        // 删除市选项
+        this.cityList = []
+      }
+      if (num <= 2) {
+        // 删除区
+        this.addFormData.areaId = ''
+        this.addFormData.area = ''
+        // 删除区选项
+        this.areaList = []
+      }
+      if (num <= 3) {
+        // 删除街道
+        this.addFormData.streetId = ''
+        this.addFormData.street = ''
+        // 删除街道选项
+        this.streetList = []
+      }
+      // 删除gps地址
+      this.addFormData.userAddress = ''
+    }
+  }
+}

+ 44 - 0
src/views/valueAddedService/orderSettleManag/mixins/examineInfo.js

@@ -0,0 +1,44 @@
+
+import { required, mobileRequired, mobile, httpUrl, email } from '@/components/template/rules_verify.js'
+export default {
+  data() {
+    return {
+
+    }
+  },
+  computed: {
+    examineInfo() {
+      return [
+        {
+          name: 'el-radio',
+          md: 24,
+          formItemAttributes: {
+            label: '审批结果',
+            prop: 'flagSh',
+            rules: [...required],
+          },
+          options: [{ label: "通过", value: "OK" }, { label: "驳回", value: "FAIL" }],
+          attributes: { disabled: false, placeholder: '请选择' },
+        },
+        {
+          name: 'el-input',
+          md: 24,
+          attributes: {
+            disabled: false,
+            type: 'textarea',
+            rows: 3,
+            placeholder: '请输入'
+          },
+          formItemAttributes: {
+            label: '审批备注',
+            prop: 'examineRemark',
+            rules: []
+          }
+        }
+      ]
+    }
+  },
+  methods: {
+
+  }
+}

+ 244 - 0
src/views/valueAddedService/orderSettleManag/mixins/formItems.js

@@ -0,0 +1,244 @@
+import ImageUpload from '@/components/file-upload'
+export default {
+  components: { ImageUpload },
+  computed: {
+    formItems() {
+      return [{
+        md: 24,
+        isShow: true,
+        name: 'slot-component',
+        formItemAttributes: {
+          label: '',
+          prop: '',
+          'label-width': '0px'
+        },
+        render: (h, { props, onInput }) => {
+          var { formData } = props
+          return (
+            <div>
+              <el-descriptions border title="" column={4} colon={false} labelStyle={{ width: '8%' }} contentStyle={{ width: '17%' }}>
+                <el-descriptions-item label="所属商户">
+                  {formData.companyWechatName}
+                </el-descriptions-item>
+                <el-descriptions-item label="销售网点">
+                  {formData.websitName}
+                </el-descriptions-item>
+                <el-descriptions-item label="订单单号" >
+                  {formData.id}
+                </el-descriptions-item>
+                <el-descriptions-item label="师傅姓名" >
+                  {formData.workerName}
+                </el-descriptions-item>
+                <el-descriptions-item label="师傅联系电话">
+                  {formData.workerMobile}
+                </el-descriptions-item>
+                <el-descriptions-item label="师傅身份证号">
+                  {formData.workerIdcard}
+                </el-descriptions-item>
+                <el-descriptions-item label="客户姓名" >
+                  {formData.userName}
+                </el-descriptions-item>
+                <el-descriptions-item label="客户电话" >
+                  {formData.userMobile}
+                </el-descriptions-item>
+                <el-descriptions-item label="详细地址">
+                  {formData.userAddress}
+                </el-descriptions-item>
+                <el-descriptions-item label="内机条码">
+                  {formData.insideCode}
+                </el-descriptions-item>
+                <el-descriptions-item label="服务单号" >
+                  {formData.serviceNo}
+                </el-descriptions-item>
+                <el-descriptions-item label="发票价格" >
+                  {formData.invoiceAmount}
+                </el-descriptions-item>
+                <el-descriptions-item label="发票时间">
+                  {formData.invoiceTime}
+                </el-descriptions-item>
+                <el-descriptions-item label="服务截止时间">
+                  {formData.serviceEndTime}
+                </el-descriptions-item>
+                <el-descriptions-item label="创建人" >
+                  {formData.createBy}
+                </el-descriptions-item>
+                <el-descriptions-item label="创建时间" >
+                  {formData.createTime}
+                </el-descriptions-item>
+                <el-descriptions-item label="支付状态">
+                  {({ "EXPIRE": "过期", "CANCEL": "取消", "PAID": "已支付", "WAIT": "待支付", "REFUND": "已退款" })[formData.payStatus] || ""}
+                </el-descriptions-item>
+                <el-descriptions-item label="支付方式">
+                  {({ 1: "微信支付", 2: "代客支付", 3: "现金支付" })[formData.payType] || ""}
+                </el-descriptions-item>
+                <el-descriptions-item label="支付订单号" >
+                  {formData.payNo}
+                </el-descriptions-item>
+                <el-descriptions-item label="支付时间" >
+                  {formData.payTime}
+                </el-descriptions-item>
+                <el-descriptions-item label="微信流水号">
+                  {formData.transcationId}
+                </el-descriptions-item>
+                <el-descriptions-item label="师傅销售佣金">
+                  {formData.workerAmount}
+                </el-descriptions-item>
+                <el-descriptions-item label="结算人员" >
+                  {formData.updateBy}
+                </el-descriptions-item>
+                <el-descriptions-item label="操作时间" >
+                  {formData.updateTime}
+                </el-descriptions-item>
+                {this.addFormData ? [
+                  <el-descriptions-item label="审批人" >
+                    {formData.examineBy}
+                  </el-descriptions-item>,
+                  <el-descriptions-item label="审批状态" >
+                    {({ WAIT: "待审核", OK: "通过", FAIL: "失败" })[formData.flag]}
+                  </el-descriptions-item>,
+                  <el-descriptions-item label="审批时间" >
+                    {formData.examineTime}
+                  </el-descriptions-item>,
+                  <el-descriptions-item label="" >
+                  </el-descriptions-item>,
+                ] : null}
+              </el-descriptions>
+              <el-descriptions border title="" column={1} colon={false} labelStyle={{ width: '8%' }} contentStyle={{ width: '92%' }}>
+                <el-descriptions-item label="订单备注">
+                  {formData.remark}
+                </el-descriptions-item>
+                <el-descriptions-item label="审批备注">
+                  {formData.examineRemark}
+                </el-descriptions-item>
+              </el-descriptions>
+            </div>
+          )
+        }
+      }]
+    },
+    formItemsList() {
+      return [{
+        md: 24,
+        isShow: true,
+        name: 'slot-component',
+        formItemAttributes: {
+          label: '',
+          prop: '',
+          'label-width': '0px'
+        },
+        render: (h, { props, onInput }) => {
+          var { formData } = props
+          return (
+            <zj-table
+              columns={[{
+                columnAttributes: {
+                  label: '服务类型',
+                  prop: 'type'
+                },
+                render: (h, { row, column, index }) => {
+                  return <div style="padding: 0 10px">
+                    {({ 1: "延保", 2: "清洗" })[row.type] || ""}
+                  </div>
+                }
+              },
+              {
+                columnAttributes: {
+                  label: '使用类型',
+                  prop: 'usedType'
+                },
+                render: (h, { row, column, index }) => {
+                  return <div style="padding: 0 10px">
+                    {({ COUNT: "使用次数", YEAR: "使用年限" })[row.usedType] || ""}
+                  </div>
+                }
+              }, {
+                columnAttributes: {
+                  label: '品牌',
+                  prop: 'brandName'
+                }
+              },
+              {
+                columnAttributes: {
+                  label: '产品大类',
+                  prop: 'mainName'
+                }
+              },
+              {
+                columnAttributes: {
+                  label: '服务内容',
+                  prop: 'content'
+                }
+              },
+              {
+                columnAttributes: {
+                  label: '服务金额(元)',
+                  prop: 'amount'
+                }
+              },
+              {
+                columnAttributes: {
+                  label: '使用限值',
+                  prop: 'limitNum'
+                }
+              },
+              {
+                columnAttributes: {
+                  label: '总手续费',
+                  prop: 'commissionAmount'
+                }
+              },
+              {
+                columnAttributes: {
+                  label: '师傅分成金额',
+                  prop: 'workerAmount'
+                }
+              },
+              {
+                columnAttributes: {
+                  label: '网点分成金额',
+                  prop: 'websitAmount'
+                }
+              }]}
+              tableData={[{
+                ...(formData.increItem || {}),
+                ...(formData.incre || {}),
+                workerAmount: formData.workerAmount,
+                websitAmount: formData.websitAmount,
+                commissionAmount: formData.commissionAmount
+              }]}
+              tableAttributes={{
+                size: 'mini',
+                border: true,
+              }} />
+          )
+        }
+      }]
+    },
+    formItemsImgs() {
+      return [{
+        md: 24,
+        name: 'slot-component',
+        formItemAttributes: {
+          label: '',
+          prop: '',
+          'label-width': '0px'
+        },
+        render: (h, { props, onInput }) => {
+          var { formData } = props
+          return (
+            <ImageUpload
+              fileList={
+                [{ key: "insideCodeImg", name: "内机条码" }, { key: "machineImg", name: "机器铭牌图片" }, { key: "buyCertImg", name: "购机凭证图片" }].map((item) => ({ url: formData[item.key], name: item.name }))
+              }
+              limit={1000}
+              isEdit={false}
+              viewOnline={false}
+              download={false}
+              showName={true}
+            />
+          )
+        }
+      }]
+    },
+  },
+}

+ 151 - 0
src/views/valueAddedService/orderSettleManag/mixins/productInfo.js

@@ -0,0 +1,151 @@
+import { required, mobileRequired, mobile, httpUrl, email } from '@/components/template/rules_verify.js'
+import ImageUpload from '@/components/file-upload'
+export default {
+  data() {
+    return {
+
+    }
+  },
+  computed: {
+    productInfo() {
+      return [
+        {
+          name: 'el-input',
+          md: 6,
+          attributes: { disabled: false, placeholder: '请输入' },
+          formItemAttributes: {
+            label: '内积条码',
+            prop: 'insideCode',
+            rules: [...required]
+          }
+        },
+        {
+          name: 'el-input',
+          md: 6,
+          attributes: { disabled: false, placeholder: '请输入' },
+          formItemAttributes: {
+            label: '发票价格',
+            prop: 'invoiceAmount',
+            rules: [...required]
+          }
+        },
+        {
+          name: 'el-date-picker',
+          md: 6,
+          attributes: {
+            disabled: false,
+            style: { width: '100%' },
+            placeholder: '请选择',
+            type: 'date',
+            'value-format': 'yyyy-MM-dd HH:mm:ss',
+            // 'picker-options': {
+            //   disabledDate: time => {
+            //     return time.getTime() < (Date.now() - 86400000)
+            //   }
+            // }
+          },
+          formItemAttributes: {
+            label: '原保到期',
+            prop: 'insureTime',
+            rules: [...required]
+          },
+          events: {
+            change: (val) => {
+              if (val && this.addFormData.limitNum) {
+                // 初始日期
+                const initialDate = new Date(val);
+                // 加上三年
+                initialDate.setFullYear(initialDate.getFullYear() + (this.addFormData.limitNum || 0));
+                // 获取新的日期
+                this.addFormData.serviceEndTime = initialDate.toISOString().split('T')[0];
+              } else {
+                this.addFormData.serviceEndTime = ""
+              }
+            }
+          }
+        },
+        {
+          name: 'el-date-picker',
+          md: 6,
+          attributes: {
+            disabled: true,
+            style: { width: '100%' },
+            placeholder: '请选择',
+            type: 'date',
+            'value-format': 'yyyy-MM-dd HH:mm:ss',
+            // 'picker-options': {
+            //   disabledDate: time => {
+            //     return time.getTime() < (Date.now() - 86400000)
+            //   }
+            // }
+          },
+          formItemAttributes: {
+            label: '服务期限',
+            prop: 'serviceEndTime',
+            rules: [...required]
+          }
+        },
+        {
+          name: 'slot-component',
+          md: 3,
+          formItemAttributes: {
+            label: '',
+            'label-width': '0px',
+            prop: 'insideCodeImg',
+            rules: [...required],
+            errLabel: '内机条码'
+          },
+          render: (h, { props }) => {
+            return (
+              <div style="padding: 0 10px">
+                <ImageUpload fileList={this.addFormData.insideCodeImg} limit={1} isEdit={true} />
+                <div style="padding-left:20px">*内机条码</div>
+              </div>
+            )
+          }
+        },
+        {
+          name: 'slot-component',
+          md: 3,
+          formItemAttributes: {
+            label: '',
+            'label-width': '0px',
+            prop: 'machineImg',
+            rules: [...required],
+            errLabel: '机器铭牌'
+          },
+          render: (h, { props }) => {
+            return (
+              <div style="padding: 0 10px">
+                <ImageUpload fileList={this.addFormData.machineImg} limit={1} isEdit={true} />
+                <div style="padding-left:20px">*机器铭牌</div>
+              </div>
+            )
+          }
+        },
+        {
+          name: 'slot-component',
+          md: 3,
+          formItemAttributes: {
+            label: '',
+            'label-width': '0px',
+            prop: 'buyCertImg',
+            rules: [...required],
+            errLabel: '购机凭证'
+          },
+          render: (h, { props }) => {
+            return (
+              <div style="padding: 0 10px">
+                <ImageUpload fileList={this.addFormData.buyCertImg} limit={1} isEdit={true} />
+                <div style="padding-left:20px">*购机凭证</div>
+              </div>
+            )
+          }
+        },
+      ]
+    }
+  },
+  methods: {
+
+  }
+}

+ 238 - 0
src/views/valueAddedService/orderSettleManag/mixins/serviceInfo.js

@@ -0,0 +1,238 @@
+import { required, mobileRequired, mobile, httpUrl, email } from '@/components/template/rules_verify.js'
+import { increOrderSettleGetBrand, increOrderSettleGetCategoryList, increOrderSettleGetIncreItem, increOrderSettleGetWebsit } from "@/api/orderSettleManag.js"
+export default {
+  data() {
+    return {
+      brandList: [],
+      mainList: [],
+      increContentList: [],
+      websitList: []
+    }
+  },
+  computed: {
+    serviceInfo() {
+      return [
+        {
+          name: 'el-select',
+          md: 6,
+          attributes: { disabled: false, placeholder: '请输入' },
+          formItemAttributes: {
+            label: '服务类型',
+            prop: 'increType',
+            rules: [...required]
+          },
+          options: [{ label: "延保", value: 1 }],
+        },
+        {
+          name: 'el-input',
+          md: 6,
+          attributes: { disabled: true, placeholder: '请输入' },
+          formItemAttributes: {
+            label: '使用类型',
+            prop: 'shiyongleixing',
+            rules: [...required]
+          }
+        },
+        {
+          name: 'el-select',
+          md: 6,
+          options: this.brandList,
+          formItemAttributes: {
+            label: '产品品牌',
+            prop: 'brandId',
+            rules: [...required]
+          },
+          attributes: { disabled: false, clearable: true, filterable: true, placeholder: '请选择' },
+          events: {
+            change: (val) => {
+              this.mainList = []
+              this.increContentList = []
+              this.websitList = []
+              this.addFormData.brandName = ""
+              this.addFormData.mainId = ""
+              this.addFormData.mainName = ""
+              this.addFormData.mainImg = ""
+              this.addFormData.increContent = ""
+              this.addFormData.pgIncreId = ""
+              this.addFormData.limitNum = ""
+              this.addFormData.amount = ""
+              this.addFormData.pgIncreItemId = ""
+              this.addFormData.websitId = ""
+              this.addFormData.websitName = ""
+              if (val) {
+                this.addFormData.brandName = this.brandList.find(item => item.value === val)?.label
+                increOrderSettleGetCategoryList({ brand: this.addFormData.brandName }).then(res => {
+                  this.mainList = res.data.map(item => ({
+                    label: item.name,
+                    value: item.categoryId,
+                    data: item
+                  }))
+                })
+              }
+            }
+          }
+        },
+        {
+          name: 'el-select',
+          md: 6,
+          options: this.mainList,
+          formItemAttributes: {
+            label: '产品大类',
+            prop: 'mainId',
+            rules: [...required]
+          },
+          attributes: { disabled: false, clearable: true, filterable: true, placeholder: '请选择' },
+          events: {
+            change: (val) => {
+              this.increContentList = []
+              this.websitList = []
+              this.addFormData.mainName = ""
+              this.addFormData.mainImg = ""
+              this.addFormData.increContent = ""
+              this.addFormData.pgIncreId = ""
+              this.addFormData.limitNum = ""
+              this.addFormData.amount = ""
+              this.addFormData.pgIncreItemId = ""
+              this.addFormData.websitId = ""
+              this.addFormData.websitName = ""
+              if (val) {
+                this.addFormData.mainName = this.mainList.find(item => item.value === val)?.label
+                this.addFormData.mainImg = this.mainList.find(item => item.value === val)?.data?.imgUrl
+                increOrderSettleGetIncreItem({
+                  brand: this.addFormData.brandName,
+                  mainName: this.addFormData.mainName
+                }).then(res => {
+                  this.increContentList = res.data.map(item => ({
+                    label: item.content,
+                    value: item.increId,
+                    data: item
+                  }))
+                })
+              }
+            }
+          }
+        },
+        {
+          name: 'el-select',
+          md: 12,
+          formItemAttributes: {
+            label: '服务内容',
+            prop: 'pgIncreId',
+            rules: [...required],
+          },
+          options: this.increContentList,
+          attributes: { disabled: false, clearable: true, filterable: true, placeholder: '请选择' },
+          events: {
+            change: (val) => {
+              this.websitList = []
+              this.addFormData.limitNum = ""
+              this.addFormData.amount = ""
+              this.addFormData.pgIncreItemId = ""
+              this.addFormData.websitId = ""
+              this.addFormData.websitName = ""
+              this.addFormData.serviceEndTime = ""
+              this.addFormData.increContent = ""
+              if (val) {
+                var data = this.increContentList.find(item => item.value === val)
+                this.addFormData.increContent = data.data.content;
+                this.addFormData.limitNum = data.data.limitNum;
+                this.addFormData.amount = data.data.amount;
+                this.addFormData.pgIncreItemId = data.data.id;
+                if (this.addFormData.insureTime && this.addFormData.limitNum) {
+                  // 初始日期
+                  const initialDate = new Date(this.addFormData.insureTime);
+                  // 加上三年
+                  initialDate.setFullYear(initialDate.getFullYear() + (this.addFormData.limitNum || 0));
+                  // 获取新的日期
+                  this.addFormData.serviceEndTime = initialDate.toISOString().split('T')[0];
+                }
+                increOrderSettleGetWebsit({
+                  increId: val
+                }).then(res => {
+                  this.websitList = res.data.map(item => ({
+                    value: item.websitId,
+                    label: item.websitName,
+                  }))
+                })
+              }
+            }
+          }
+        },
+        {
+          name: 'el-input',
+          md: 6,
+          attributes: { disabled: true, placeholder: '请输入' },
+          formItemAttributes: {
+            label: '使用限值',
+            prop: 'limitNum',
+            rules: [...required]
+          },
+          events: {
+            change: (val) => {
+              if (this.addFormData.insureTime && val) {
+                // 初始日期
+                const initialDate = new Date(this.addFormData.insureTime);
+                // 加上三年
+                initialDate.setFullYear(initialDate.getFullYear() + (val || 0));
+                // 获取新的日期
+                this.addFormData.serviceEndTime = initialDate.toISOString().split('T')[0];
+              } else {
+                this.addFormData.serviceEndTime = ""
+              }
+            }
+          }
+        },
+        {
+          name: 'el-input',
+          md: 6,
+          attributes: { disabled: false, placeholder: '请输入', type: 'number' },
+          formItemAttributes: {
+            label: '服务金额',
+            prop: 'amount',
+            rules: [...required]
+          }
+        },
+        {
+          name: 'el-select',
+          md: 12,
+          formItemAttributes: {
+            label: '销售网点',
+            prop: 'websitId',
+            rules: [...required],
+          },
+          options: this.websitList,
+          attributes: { disabled: false, clearable: true, filterable: true, placeholder: '请选择' },
+          events: {
+            change: (val) => {
+              this.addFormData.websitName = ""
+              if (val) {
+                this.addFormData.websitName = this.websitList.find(item => item.value === val)?.label
+              }
+            }
+          }
+        },
+        {
+          name: 'el-radio',
+          md: 12,
+          formItemAttributes: {
+            label: '支付方式',
+            prop: 'payType',
+            rules: [...required],
+          },
+          options: [{ label: "微信支付", value: 1 }, { label: "现金支付", value: 3 }],
+          attributes: { disabled: false, placeholder: '请选择' },
+        },
+      ]
+    }
+  },
+  methods: {
+    getincreOrderSettleGetBrand() {
+      increOrderSettleGetBrand().then(res => {
+        this.brandList = res.data.map(item => ({
+          label: item.brandName,
+          value: item.id
+        }))
+      })
+    }
+  }
+}

+ 264 - 0
src/views/valueAddedService/orderSettleManag/pages/collect.vue

@@ -0,0 +1,264 @@
+<template>
+  <template-page ref="pageRef" :get-list="getList" :exportList="exportList" :table-attributes="tableAttributes"
+    :table-events="tableEvents" :moreParameters="moreParameters" :column-parsing="columnParsing" :operation="operation()"
+    :operationColumnWidth="200" :optionsEvensGroup="optionsEvensGroup">
+    <div class="cartographer">
+      <el-dialog :title="formTypeName[formType]" width="100%" :modal="false" :visible.sync="formDialog"
+        :before-close="formCancel">
+        <zj-form-container v-if="formDialog" ref="formRef" :form-data="formData" :styleSwitch="false">
+          <zj-form-module title="基础信息" label-width="120px" :showPackUp="false" :form-data="formData"
+            :form-items="formItems">
+          </zj-form-module>
+          <zj-form-module title="订单信息" label-width="120px" :showPackUp="false" :form-data="formData"
+            :form-items="formItemsList">
+          </zj-form-module>
+          <zj-form-module title="附件图片" label-width="120px" :showPackUp="false" :form-data="formData"
+            :form-items="formItemsImgs">
+          </zj-form-module>
+        </zj-form-container>
+        <div slot="footer" v-if="formType" class="dialog-footer">
+          <el-button size="mini" @click="formCancel">取 消</el-button>
+          <el-button size="mini" @click="formConfirm" type="primary">确定</el-button>
+        </div>
+      </el-dialog>
+    </div>
+  </template-page>
+</template>
+
+<script>
+import TemplatePage from '@/components/template/template-page-1.vue'
+import import_mixin from '@/components/template/import_mixin.js'
+import { increOrderSettleList, increOrderSettleListExport, increOrderSettleDetail, increOrderSettleConfirm, increOrderSettleRefund } from "@/api/orderSettleManag.js"
+import operation_mixin from '@/components/template/operation_mixin.js'
+import formItems from "../mixins/formItems.js"
+export default {
+  props: {
+    storageType: {
+      type: String,
+      default: ""
+    }
+  },
+  components: { TemplatePage },
+  mixins: [import_mixin, operation_mixin, formItems],
+  data() {
+    return {
+      // 表格属性
+      tableAttributes: {
+        // 启用勾选列
+        selectColumn: true,
+        selectable: this.selectable
+      },
+      // 表格事件
+      tableEvents: {
+        'selection-change': this.selectionChange
+      },
+      // 勾选选中数据
+      recordSelected: [],
+      formTypeName: ["查看", "结算"],
+      formType: -1,
+      formData: {
+        pgIncreItems: []
+      },
+      formDialog: false,
+    }
+  },
+  computed: {
+    // 事件组合
+    optionsEvensGroup() {
+      return [
+        [
+          [
+            this.optionsEvensAuth("bulkSettlemen", {
+              click: () => {
+                if (this.recordSelected.length === 0) {
+                  this.$message.warning('请勾选订单')
+                  return
+                }
+                increOrderSettleConfirm(this.recordSelected.map(item => item.id)).then(res => {
+                  this.$message({ type: 'success', message: `成功!` })
+                  this.$refs.pageRef.refreshList()
+                })
+              }
+            })
+          ],
+        ]
+      ]
+    },
+    // 更多参数
+    moreParameters() {
+      return [
+        {
+          name: '支付状态',
+          key: 'payStatus',
+          value: '',
+          conditions: [
+            {
+              label: "全部",
+              value: ""
+            }, {
+              label: "已支付",
+              value: "PAID"
+            }, {
+              label: "待支付",
+              value: "WAIT"
+            }, {
+              label: "已退款",
+              value: "REFUND"
+            }, {
+              label: "过期",
+              value: "EXPIRE"
+            }, {
+              label: "取消",
+              value: "CANCEL"
+            }]
+        },
+      ]
+    }
+  },
+  methods: {
+    selectable(row, index) {
+      return ["PAID"].includes(Object.entries(row.selectMapData.payStatus).find(([key, val]) => val == row.payStatus)?.[0]) &&
+        ["ING"].includes(Object.entries(row.selectMapData.settleStatus).find(([key, val]) => val == row.settleStatus)?.[0])
+    },
+    // 列表请求函数
+    getList(p, cb) {
+      var pam = JSON.parse(JSON.stringify(p))
+      try {
+        if (pam.payStatus) {
+          pam.params.push({ "param": "a.pay_status", "compare": "=", "value": pam.payStatus })
+        }
+        pam.params.push({ "param": "a.order_channel", "compare": "=", "value": "ONLINE" })
+        cb && cb(pam)
+        return increOrderSettleList(pam)
+      } catch (err) {
+      }
+    },
+    // 列表导出函数
+    exportList: increOrderSettleListExport,
+    // 表格列解析渲染数据更改
+    columnParsing(item, defaultData) {
+      if (item.jname === 'residuNum') {
+        defaultData.render = (h, { row, index, column }) => {
+          return (
+            <div style="padding:0 6px;cursor: pointer;">
+              {row["increType"] != 1 ? row["residuNum"] : ""}
+            </div>
+          )
+        }
+      }
+      if (item.jname === 'serviceEndTime') {
+        defaultData.render = (h, { row, index, column }) => {
+          return (
+            <div style="padding:0 6px;cursor: pointer;">
+              {row[column.columnAttributes.prop] ? row[column.columnAttributes.prop].split(" ")[0] : ""}
+            </div>
+          )
+        }
+      }
+      return defaultData
+    },
+    // 监听勾选变化
+    selectionChange(data) {
+      this.recordSelected = data
+    },
+    // 表格操作列
+    operation() {
+      return this.operationBtn({
+        detail: {
+          btnType: 'text',
+          click: ({ row, index, column }) => {
+            this.formType = 0
+            this.getDetail(row.id)
+          }
+        },
+        orderDetail: {
+          btnType: 'text',
+          conditions: ({ row, index, column }) => {
+            return ["PAID", "REFUND"].includes(row.payStatus)
+          },
+          click: ({ row, index, column }) => {
+            this.$router.push({
+              name: "workOrderPool",
+              query: {
+                pgIncreItemId: row.id,
+              }
+            })
+          }
+        },
+        refund: {
+          btnType: 'text',
+          prompt: '是否确定退款?',
+          conditions: ({ row, index, column }) => {
+            return ["PAID"].includes(row.payStatus) && ["ING"].includes(row.settleStatus) && (() => {
+              var currentDate = new Date(row.payTime);
+              currentDate.setDate(currentDate.getDate() + 7);
+              currentDate.setHours(23);
+              currentDate.setMinutes(59);
+              currentDate.setSeconds(59);
+              return currentDate > new Date()
+            })()
+          },
+          click: ({ row, index, column }) => {
+            increOrderSettleRefund({ id: row.id }).then(res => {
+              this.$message({ type: 'success', message: `退款成功!` })
+              this.$refs.pageRef.refreshList()
+            })
+          }
+        },
+        settlement: {
+          btnType: 'text',
+          prompt: '是否确定结算?',
+          conditions: ({ row, index, column }) => {
+            return ["PAID"].includes(row.payStatus) && ["ING"].includes(row.settleStatus)
+          },
+          click: ({ row, index, column }) => {
+            this.formType = 1
+            this.getDetail(row.id)
+          }
+        },
+      })
+    },
+    getDetail(id) {
+      increOrderSettleDetail({ id }).then(res => {
+        Object.assign(this.formData, res.data)
+        this.openForm()
+      })
+    },
+    openForm() {
+      this.formDialog = true
+    },
+    // 关闭弹窗
+    formCancel() {
+      this.$refs.formRef.$refs.inlineForm.clearValidate()
+      this.$data.formData = this.$options.data().formData
+      this.formDialog = false
+    },
+    formConfirm() {
+      this.$refs.formRef.validate((valid, invalidFields, errLabels) => {
+        if (valid) {
+          increOrderSettleConfirm([this.formData.id]).then(res => {
+            this.$message({ type: 'success', message: `操作成功!` })
+            this.formCancel()
+            this.$refs.pageRef.refreshList()
+          })
+        }
+      })
+    },
+  }
+}
+
+
+
+
+
+</script>
+
+<style lang="scss">
+.redbordererr {
+  .el-form-item {
+    margin: 0 !important;
+    overflow: hidden;
+  }
+}
+</style>
+

+ 398 - 0
src/views/valueAddedService/orderSettleManag/pages/offline.vue

@@ -0,0 +1,398 @@
+<template>
+  <template-page ref="pageRef" :get-list="getList" :exportList="exportList" :table-attributes="tableAttributes"
+    :table-events="tableEvents" :moreParameters="moreParameters" :column-parsing="columnParsing" :operation="operation()"
+    :operationColumnWidth="200" :optionsEvensGroup="optionsEvensGroup">
+    <div class="cartographer">
+      <el-dialog :title="formTypeName[formType]" width="100%" :modal="false" :visible.sync="formDialog"
+        :before-close="formCancel">
+        <zj-form-container v-if="formDialog" ref="formRef" :form-data="formData" :styleSwitch="false">
+          <zj-form-module title="基础信息" label-width="120px" :showPackUp="false" :form-data="formData"
+            :form-items="formItems">
+          </zj-form-module>
+          <zj-form-module title="订单信息" label-width="120px" :showPackUp="false" :form-data="formData"
+            :form-items="formItemsList">
+          </zj-form-module>
+          <zj-form-module title="附件图片" label-width="120px" :showPackUp="false" :form-data="formData"
+            :form-items="formItemsImgs">
+          </zj-form-module>
+          <zj-form-module v-if="formType == 1" title="审核信息" label-width="120px" :showPackUp="false" :form-data="formData"
+            :form-items="examineInfo">
+          </zj-form-module>
+        </zj-form-container>
+        <div v-if="formType == 1 && formDshType" slot="footer" class="dialog-footer">
+          <el-button size="mini" type="primary" @click="shenhexinxi">审核</el-button>
+        </div>
+        <div v-if="formType == 0 && formData.flag == 'OK' && formData.payStatus == 'WAIT' && formData.payType == 1"
+          slot="footer" class="dialog-footer">
+          <el-button size="mini" type="primary" @click="() => { wxPay(formData.id) }">微信支付</el-button>
+        </div>
+      </el-dialog>
+    </div>
+    <div class="cartographer">
+      <el-dialog title="新增" width="100%" :modal="false" :visible.sync="addFormDialog" :before-close="addFormCancel">
+        <zj-form-container v-if="addFormDialog" ref="addFormRef" :form-data="addFormData">
+          <zj-form-module title="客户信息" label-width="80px" :form-data="addFormData" :form-items="basicInfo">
+          </zj-form-module>
+          <zj-form-module title="服务信息" label-width="80px" :form-data="addFormData" :form-items="serviceInfo">
+          </zj-form-module>
+          <zj-form-module title="产品信息" label-width="80px" :form-data="addFormData" :form-items="productInfo">
+          </zj-form-module>
+        </zj-form-container>
+        <div slot="footer" class="dialog-footer">
+          <el-button size="mini" type="primary" @click="formConfirm">提交</el-button>
+        </div>
+      </el-dialog>
+    </div>
+    <el-dialog title="微信支付" :visible.sync="isPay" width="50%" :close-on-click-modal="false" :modal-append-to-body="false"
+      @close="codeUrl = ''">
+      <h3 style="text-align: center;">扫二维码支付</h3>
+      <div ref="payQRCode" style="display: flex; justify-content: center;" />
+      <div style="color: #EA8000;text-align: center;margin-top: 20px;">注:支付成功后,方可操作!</div>
+      <div style="display: flex;justify-content: flex-end;margin-top: 30px;">
+        <el-button size="mini" type="text" @click="codeUrl = ''">取消</el-button>
+      </div>
+    </el-dialog>
+  </template-page>
+</template>
+
+<script>
+import TemplatePage from '@/components/template/template-page-1.vue'
+import import_mixin from '@/components/template/import_mixin.js'
+import { increOrderSettleExamine, increOrderSettleGetBrand, increOrderSettleGeneratePayCode, increOrderSettleList, increOrderSettleListExport, increOrderSettleAdd, increOrderSettleDetail, increOrderSettleConfirm, increOrderSettleRefund } from "@/api/orderSettleManag.js"
+import operation_mixin from '@/components/template/operation_mixin.js'
+import formItems from "../mixins/formItems.js"
+import basicInfo from "../mixins/basicInfo.js"
+import serviceInfo from "../mixins/serviceInfo.js"
+import productInfo from "../mixins/productInfo.js"
+import examineInfo from "../mixins/examineInfo.js"
+import QRCode from "qrcodejs2";
+export default {
+  props: {
+    storageType: {
+      type: String,
+      default: ""
+    }
+  },
+  components: { TemplatePage },
+  mixins: [import_mixin, operation_mixin, formItems, basicInfo, serviceInfo, productInfo, examineInfo],
+  data() {
+    return {
+      isPay: false,
+      codeUrl: "",
+      // 表格属性
+      tableAttributes: {
+      },
+      // 表格事件
+      tableEvents: {
+      },
+      // 勾选选中数据
+      recordSelected: [],
+      formTypeName: ["查看", "审批"],
+      formType: -1,
+      formData: {
+        flagSh: "",
+        flag: "",
+        examineRemark: "",
+        pgIncreItems: []
+      },
+      formDialog: false,
+      addFormDialog: false,
+      formDshType: false,
+      addFormData: {
+        shiyongleixing: "按使用年限",
+        "amount": "",
+        "brandId": "",
+        "brandName": "",
+        "buyCertImg": [],
+        "commissionAmount": "",
+        "companyWechatId": "",
+        "companyWechatName": "",
+        "createBy": "",
+        "createTime": "",
+        "examineBy": "",
+        "examineRemark": "",
+        "examineTime": "",
+        "flag": "",
+        "id": "",
+        "increContent": "",
+        "increType": "",
+        "insideCode": "",
+        "insideCodeImg": [],
+        "insureTime": "",
+        "invoiceAmount": "",
+        "invoiceTime": "",
+        "limitNum": "",
+        "machineImg": [],
+        "mainId": "",
+        "mainImg": "",
+        "mainName": "",
+        "orderChannel": "",
+        "payNo": "",
+        "payStatus": "",
+        "payTime": "",
+        "payType": "",
+        "pgIncreId": "",
+        "pgIncreItemId": "",
+        "refundNo": "",
+        "refundTime": "",
+        "remark": "",
+        "residuNum": "",
+        "serviceEndTime": "",
+        "serviceNo": "",
+        "settleRemark": "",
+        "settleStatus": "",
+        "transcationId": "",
+        "updateBy": "",
+        "updateTime": "",
+        "userAddress": "",
+        "userAddressId": "",
+        "userMobile": "",
+        "userName": "",
+        "websitAmount": "",
+        "websitId": "",
+        "websitName": "",
+        "workerAmount": "",
+        "workerId": "",
+        "workerIdcard": "",
+        "workerMobile": "",
+        "workerName": "",
+        "workerOpenId": ""
+      },
+    }
+  },
+  computed: {
+    // 事件组合
+    optionsEvensGroup() {
+      return [
+        [
+          [
+            this.optionsEvensAuth("add", {
+              click: () => {
+                this.addFormOpen()
+              }
+            })
+          ],
+        ]
+      ]
+    },
+    // 更多参数
+    moreParameters() {
+      return [
+        {
+          name: '审批状态',
+          key: 'flag',
+          value: '',
+          conditions: [
+            {
+              label: "全部",
+              value: ""
+            }, {
+              label: "待审核",
+              value: "WAIT"
+            }, {
+              label: "通过",
+              value: "OK"
+            }, {
+              label: "失败",
+              value: "FAIL"
+            }]
+        },
+      ]
+    },
+  },
+  watch: {
+    codeUrl(newVal) {
+      this.isPay = !!newVal
+      if (!this.isPay) {
+        if (this.wxpayTimeId) {
+          clearTimeout(this.wxpayTimeId)
+        }
+        this.formCancel()
+        this.addFormCancel()
+        this.$refs?.pageRef?.refreshList()
+      }
+    }
+  },
+  methods: {
+    wxPay(id) {
+      increOrderSettleGeneratePayCode({ id }).then(res => {
+        this.codeUrl = res.data.codeUrl
+        if(this.$refs?.payQRCode?.innerHTML){
+          this.$refs.payQRCode.innerHTML = '';
+        }
+        this.$nextTick(() => {
+          new QRCode(this.$refs.payQRCode, {
+            text: res.data.codeUrl,
+            width: 200,
+            height: 200,
+            colorDark: "#333333", // 二维码颜色
+            colorLight: "#ffffff", // 二维码背景色
+            correctLevel: QRCode.CorrectLevel.L // 容错率,L/M/H
+          });
+          this.wxpaygetDetail(id)
+        });
+      })
+    },
+    wxpaygetDetail(id) {
+      if (this.wxpayTimeId) {
+        clearTimeout(this.wxpayTimeId)
+      }
+      this.wxpayTimeId = setTimeout(() => {
+        increOrderSettleDetail({ id }).then(res => {
+          if (res.data.payStatus == "PAID" && res.data.payType == 1) {
+            this.codeUrl = ""
+            this.addFormCancel()
+          } else {
+            this.wxpaygetDetail(id)
+          }
+        })
+      }, 1000)
+    },
+    // 列表请求函数
+    getList(p, cb) {
+      var pam = JSON.parse(JSON.stringify(p))
+      try {
+        if (pam.flag) {
+          pam.params.push({ "param": "a.flag", "compare": "=", "value": pam.flag })
+        }
+        pam.params.push({ "param": "a.order_channel", "compare": "=", "value": "SELF" })
+        cb && cb(pam)
+        return increOrderSettleList(pam)
+      } catch (err) {
+      }
+    },
+    // 列表导出函数
+    exportList: increOrderSettleListExport,
+    // 表格列解析渲染数据更改
+    columnParsing(item, defaultData) {
+      if (item.jname === 'residuNum') {
+        defaultData.render = (h, { row, index, column }) => {
+          return (
+            <div style="padding:0 6px;cursor: pointer;">
+              {row["increType"] != 1 ? row["residuNum"] : ""}
+            </div>
+          )
+        }
+      }
+      if (item.jname === 'serviceEndTime') {
+        defaultData.render = (h, { row, index, column }) => {
+          return (
+            <div style="padding:0 6px;cursor: pointer;">
+              {row[column.columnAttributes.prop] ? row[column.columnAttributes.prop].split(" ")[0] : ""}
+            </div>
+          )
+        }
+      }
+      return defaultData
+    },
+    // 表格操作列
+    operation() {
+      return this.operationBtn({
+        detail: {
+          btnType: 'text',
+          click: ({ row, index, column }) => {
+            this.formType = 0
+            this.getDetail(row.id)
+          }
+        },
+        orderDetail: {
+          btnType: 'text',
+          conditions: ({ row, index, column }) => {
+            return ["PAID", "REFUND"].includes(row.payStatus)
+          },
+          click: ({ row, index, column }) => {
+            this.$router.push({
+              name: "workOrderPool",
+              query: {
+                pgIncreItemId: row.id,
+              }
+            })
+          }
+        },
+        examine: {
+          btnType: 'text',
+          conditions: ({ row, index, column }) => {
+            return row.flag == "WAIT"
+          },
+          click: ({ row, index, column }) => {
+            this.formType = 1
+            this.formDshType = true
+            this.getDetail(row.id)
+          }
+        },
+      })
+    },
+    getDetail(id) {
+      increOrderSettleDetail({ id }).then(res => {
+        Object.assign(this.formData, res.data)
+        this.openForm()
+      })
+    },
+    openForm() {
+      this.formDialog = true
+    },
+    // 关闭弹窗
+    formCancel() {
+      this.formDshType = false
+      this.$refs?.formRef?.$refs?.inlineForm?.clearValidate()
+      this.$data.formData = this.$options.data().formData
+      this.formDialog = false
+    },
+    openAddForm() {
+      this.formDialog = true
+    },
+    shenhexinxi() {
+      this.$refs.formRef.validate((valid, invalidFields, errLabels) => {
+        if (valid) {
+          increOrderSettleExamine({ ...this.formData, flag: this.formData.flagSh }).then(res => {
+            this.$message({ type: 'success', message: `审核完成!` })
+            this.formCancel()
+            this.$refs?.pageRef?.refreshList()
+          })
+        }
+      })
+    },
+    addFormCancel() {
+      this.formDshType = false
+      this.$refs?.addFormRef?.$refs?.inlineForm?.clearValidate()
+      this.$data.addFormData = this.$options.data().addFormData
+      this.addFormDialog = false
+    },
+    addFormOpen() {
+      this.getincreOrderSettleGetBrand()
+      this.addFormDialog = true
+    },
+    formConfirm() {
+      this.$refs.addFormRef.validate((valid, invalidFields, errLabels) => {
+        if (valid) {
+          increOrderSettleAdd({
+            ...this.addFormData,
+            "serviceEndTime": this.addFormData.serviceEndTime + " 23:59:59",
+            "buyCertImg": this.addFormData.buyCertImg.map(item => item.url).join(","),
+            "insideCodeImg": this.addFormData.insideCodeImg.map(item => item.url).join(","),
+            "machineImg": this.addFormData.machineImg.map(item => item.url).join(","),
+          }).then(res => {
+            this.$message({ type: 'success', message: `新增成功!` })
+            this.$refs?.pageRef?.refreshList()
+            this.addFormCancel()
+            // if (res.data.payStatus == "WAIT" && res.data.payType == 1) {
+            //   this.wxPay(res.data.id)
+            // } else {
+            //   this.addFormCancel()
+            // }
+          })
+        }
+      })
+    },
+  }
+}
+</script>
+
+<style lang="scss">
+.redbordererr {
+  .el-form-item {
+    margin: 0 !important;
+    overflow: hidden;
+  }
+}
+</style>

+ 2 - 0
src/views/valueAddedService/valueAddedConfig/index.vue

@@ -189,6 +189,7 @@ export default {
             return this.isEditIndex == index ? <div class="redbordererr">
               <el-form-item label="" label-width="0px" prop={`pgIncreItems.${index}.${column.columnAttributes.prop}`} rules={required}>
                 <el-input
+                  type="number"
                   value={row[column.columnAttributes.prop]}
                   onInput={(val) => {
                     row[column.columnAttributes.prop] = val
@@ -212,6 +213,7 @@ export default {
             return this.isEditIndex == index ? <div class="redbordererr">
               <el-form-item label="" label-width="0px" prop={`pgIncreItems.${index}.${column.columnAttributes.prop}`} rules={required}>
                 <el-input
+                  type="number"
                   value={row[column.columnAttributes.prop]}
                   onInput={(val) => {
                     row[column.columnAttributes.prop] = val && row.amount && Number(val) > Number(row.amount) ? row.amount : val

+ 1162 - 0
src/views/workOrder/completedToBeSettled/index.vue

@@ -0,0 +1,1162 @@
+<template>
+	<template-page ref="pageRef" :getList="getList" :optionsEvensGroup="optionsEvensGroup" :columnParsing="columnParsing"
+		:tableAttributes="tableAttributes" :tableEvents="tableEvents" :moreParameters="moreParameters"
+		:screeningAnalysis="screeningAnalysis" :filterMethod="filterMethod" :replaceOrNotMap="true">
+	</template-page>
+</template>
+
+<script>
+import TemplatePage from '@/components/template/template-page-1.vue'
+import import_mixin from '@/components/template/import_mixin.js'
+import operation_mixin from '@/components/template/operation_mixin.js'
+import { listPageV2 as listPageV3 } from "@/api/workOrder/settlementStandardInstall";
+import { listPageV2 as listPageV2Repair } from "@/api/workOrder/settlementStandardRepair";
+import { orderBaseList2, orderBaseStatusCount2, orderBaseSettleNormDetail2, settleNormInstallQuery, orderBaseSettleNormConfirm, settleNormOtherQuery, orderBaseSettleNormReset } from "@/api/workOrderPool.js"
+import { listPageV2 } from "@/api/workOrder/orderType";
+import ywgdjs from "@/assets/ywgdjs.png"
+import yjs from "@/assets/yjs.png"
+import { required } from '@/components/template/rules_verify.js'
+export default {
+	components: {
+		TemplatePage,
+	},
+	mixins: [import_mixin, operation_mixin],
+	data() {
+		return {
+			// 表格属性
+			tableAttributes: {
+				columnExpand: this.columnExpand
+			},
+			// 表格事件
+			tableEvents: {
+				'expand-change': this.expandChange
+			},
+			orderTypeList: [],
+			orderStatusList: [],
+		}
+	},
+	computed: {
+		moreParameters() {
+			return [
+				{
+					name: '工单类型',
+					key: 'orderSmallType',
+					value: '',
+					conditions: [{
+						label: "全部",
+						value: ""
+					}, ...this.orderTypeList]
+				},
+				{
+					name: '工单状态',
+					key: 'orderStatus',
+					value: this.$route.query.orderStatus || "",
+					conditions: [{
+						label: "全部",
+						value: ""
+					}, ...this.orderStatusList]
+				}
+			]
+		},
+		// 用户信息
+		userInfo() {
+			return JSON.parse(localStorage.getItem('greemall_user'))
+		},
+		// 事件组合
+		optionsEvensGroup() {
+			return []
+		}
+	},
+	created() {
+		// 获取工单类型
+		listPageV2({ "pageNum": 1, "pageSize": -1, "params": [{ "param": "a.status", "compare": "=", "value": "true" }] }).then(res => {
+			this.orderTypeList = res.data.records.map(item => ({
+				value: item.id,
+				label: item.orderSmallTypeText
+			}))
+		})
+	},
+	methods: {
+
+		screeningAnalysis(jname, val) {
+			if (jname == 'orderFlags') {
+				return (val || []).map(item => item.tagName).join(',')
+			} else {
+				return val
+			}
+		},
+
+		filterMethod(value, row, column) {
+			if (column['property'] == 'orderFlags') {
+				return (row[column['property']] || []).map(item => item.tagName).join(',') === value
+			}
+			return row[column['property']] === value
+		},
+
+		// 获取统计
+		getOrderBaseStatusCount(...p) {
+			orderBaseStatusCount2(...p).then(res => {
+				this.orderStatusList = [{
+					label: "已完工待结算",
+					value: "YWG"
+				}, {
+					label: "已结算",
+					value: "YJS"
+				}].map(item => {
+					var data = res.data.find(val => val.orderStatus == item.value)
+					if (data) {
+						item.label = `${item.label}(${data.total})`
+					}
+					return item
+				})
+			})
+		},
+
+		// 列表请求函数
+		getList(p, cb) {
+			var pam = JSON.parse(JSON.stringify(p))
+			try {
+				if (pam.orderStatus) {
+					pam.params.push({ "param": "a.order_status", "compare": "=", "value": pam.orderStatus })
+				}
+				if (pam.orderSmallType) {
+					pam.params.push({ "param": "a.order_small_type", "compare": "=", "value": pam.orderSmallType })
+				}
+				cb && cb(pam)
+				return orderBaseList2(pam)
+			} catch (err) {
+			} finally {
+				this.$nextTick(() => {
+					this.getOrderBaseStatusCount({ orderSmallType: pam.orderSmallType || "" })
+				})
+			}
+		},
+
+		// 表格列解析渲染数据更改
+		columnParsing(item, defaultData) {
+			if (item.jname === 'orderFlags') {
+				defaultData.render = (h, { row, index, column }) => {
+					return (
+						<div style="padding:0 6px;display:flex;align-items:center;">
+							{(row[column.columnAttributes.prop] || []).map(item => {
+								if (item.tagName == "已完工") {
+									return (
+										<img src={ywgdjs} style="width:22px;height:22px;" />
+									)
+								} else if (item.tagName == "已结算") {
+									return (
+										<img src={yjs} style="width:22px;height:22px;" />
+									)
+								} else {
+									return (
+										<div style="display: inline-block;border:1px solid #409EFF; color:#409EFF;padding:0 2px;border-radius: 4px;margin:2px 2px 0 0;">
+											{item.tagName}
+										</div>
+									)
+								}
+							})}
+						</div>
+					)
+				}
+			}
+			if (item.jname === 'appointmentTime') {
+				defaultData.render = (h, { row, index, column }) => {
+					return (
+						<div style="padding:0 6px;cursor: pointer;">
+							{row[column.columnAttributes.prop] ? row[column.columnAttributes.prop].split(" ")[0] : ""}
+						</div>
+					)
+				}
+			}
+			return defaultData
+		},
+
+		expandChange(row) {
+			if (!row.expandData) {
+				orderBaseSettleNormDetail2({
+					id: row.id,
+					orderProductId: row.pgOrderProductId
+				}).then(res => {
+					this.zhuzhuang(res.data).then(res => {
+						row.expandData = res
+					})
+				})
+			}
+		},
+
+		columnExpand(h, { row, column, index }) {
+			var expandDataForm = row.expandData
+			var rowZhu = row
+			return expandDataForm ? (<div style="box-sizing: border-box;padding: 10px 10px 0px 50px;">
+				<zj-form-container form-data={expandDataForm}
+					formAttributes={{ 'label-position': 'top' }}
+					styleSwitch={false}>
+					<zj-form-module title="费用结算" showHade={false} form-data={expandDataForm}
+						form-items={[{
+							md: 24,
+							name: 'slot-component',
+							formItemAttributes: {
+								label: '费用结算',
+								prop: 'normList',
+							},
+							render: (h, { props, onInput }) => {
+								var { formData } = props
+								var columns = [{
+									columnAttributes: {
+										label: '工单类型',
+										prop: 'typeName'
+									},
+								},
+								{
+									columnAttributes: {
+										label: '结算工单来源',
+										prop: 'channelId',
+										width: '110'
+									},
+									render: (h, { row, column, index }) => {
+										return this.panfuan(row) ? <div class="redbordererr">
+											<el-form-item label="" label-width="0px" prop={`normList.${index}.${column.columnAttributes.prop}`} rules={required}>
+												<el-select
+													disabled={expandDataForm.normListBj || !row.bianji}
+													value={row[column.columnAttributes.prop]}
+													onInput={(val) => { row[column.columnAttributes.prop] = val }}
+													onChange={(val) => {
+														row.parentCategoryId = ""
+														row.parentCategoryName = ""
+														row.categoryId = ""
+														row.categoryName = ""
+														row.label = ""
+														row.normAmount = ""
+														row.repairAmount = ""
+														row.settleNormId = ""
+														if (val) {
+															var data = this.classifyListChuLi(expandDataForm.classifyList, "orderChannelId", "orderChannelText").find(item => item.value == val)
+															row.channelText = data.label
+														} else {
+															row.channelText = ""
+														}
+													}}
+													placeholder="请选择">
+													{this.classifyListChuLi(expandDataForm.classifyList, "orderChannelId", "orderChannelText").map((item, index_) => <el-option key={index_} label={item.label} value={item.value}></el-option>)}
+												</el-select>
+											</el-form-item>
+										</div> : null
+									}
+								},
+								{
+									columnAttributes: {
+										label: '结算产品大类',
+										prop: 'parentCategoryId',
+										width: '110'
+									},
+									render: (h, { row, column, index }) => {
+										return this.panfuan(row) ? <div class="redbordererr">
+											<el-form-item label="" label-width="0px" prop={`normList.${index}.${column.columnAttributes.prop}`} rules={required}>
+												<el-select
+													disabled={expandDataForm.normListBj || !row.bianji}
+													value={row[column.columnAttributes.prop]}
+													onInput={(val) => { row[column.columnAttributes.prop] = val }}
+													onChange={(val) => {
+														row.categoryId = ""
+														row.categoryName = ""
+														row.label = ""
+														row.normAmount = ""
+														row.repairAmount = ""
+														row.settleNormId = ""
+														if (val) {
+															var data = this.classifyListChuLi(expandDataForm.classifyList, "parentCategoryId", "parentCategoryName", (item) => item.orderChannelId == row.channelId).find(item => item.value == val)
+															row.parentCategoryName = data.label
+														} else {
+															row.parentCategoryName = ""
+														}
+													}}
+													placeholder="请选择">
+													{this.classifyListChuLi(expandDataForm.classifyList, "parentCategoryId", "parentCategoryName", (item) => item.orderChannelId == row.channelId).map((item, index_) => <el-option key={index_} label={item.label} value={item.value}></el-option>)}
+												</el-select>
+											</el-form-item>
+										</div> : null
+									}
+								},
+								{
+									columnAttributes: {
+										label: '结算产品小类',
+										prop: 'categoryId',
+										width: '110'
+									},
+									render: (h, { row, column, index }) => {
+										return this.panfuan(row) ? <div class="redbordererr">
+											<el-form-item label="" label-width="0px" prop={`normList.${index}.${column.columnAttributes.prop}`} rules={required}>
+												<el-select
+													disabled={expandDataForm.normListBj || !row.bianji}
+													value={row[column.columnAttributes.prop]}
+													onInput={(val) => { row[column.columnAttributes.prop] = val }}
+													onChange={(val) => {
+														row.label = ""
+														row.normAmount = ""
+														row.repairAmount = ""
+														row.settleNormId = ""
+														if (val) {
+															var data = this.classifyListChuLi(expandDataForm.classifyList, "categoryId", "categoryName", (item) => item.orderChannelId == row.channelId && item.parentCategoryId == row.parentCategoryId).find(item => item.value == val)
+															row.categoryName = data.label
+														} else {
+															row.categoryName = ""
+														}
+													}}
+													placeholder="请选择">
+													{this.classifyListChuLi(expandDataForm.classifyList, "categoryId", "categoryName", (item) => item.orderChannelId == row.channelId && item.parentCategoryId == row.parentCategoryId).map((item, index_) => <el-option key={index_} label={item.label} value={item.value}></el-option>)}
+												</el-select>
+											</el-form-item>
+										</div> : null
+									}
+								},
+								...(() => {
+									if (expandDataForm.orderType == 'INSTALL') {
+										return [
+											{
+												columnAttributes: {
+													label: '结算功率',
+													prop: 'label'
+												},
+												render: (h, { row, column, index }) => {
+													return this.panfuan(row) ? <div class="redbordererr">
+														<el-form-item label="" label-width="0px" prop={`normList.${index}.${column.columnAttributes.prop}`} rules={required}>
+															<el-select
+																disabled={expandDataForm.normListBj || !row.bianji}
+																value={row[column.columnAttributes.prop]}
+																onInput={(val) => { row[column.columnAttributes.prop] = val }}
+																onChange={(val) => {
+																	if (val) {
+																		var data = this.getflList(expandDataForm.gonglv, row).find(item => item.label == val)
+																		row.normAmount = data.normAmount
+																		row.settleNormId = data.id
+																	} else {
+																		row.normAmount = ""
+																		row.settleNormId = ""
+																	}
+																}}
+																placeholder="请选择">
+																{this.getflList(expandDataForm.gonglv, row).map((item, index_) => <el-option key={index_} label={item.label} value={item.label}></el-option>)}
+															</el-select>
+														</el-form-item>
+													</div> : null
+												}
+											},
+											{
+												columnAttributes: {
+													label: '结算标准(元/套)',
+													prop: 'normAmount',
+													width: "160px"
+												},
+											},
+											{
+												columnAttributes: {
+													label: '结算数量',
+													prop: 'settleNum',
+													width: "160px"
+												},
+												render: (h, { row, column, index }) => {
+													return this.panfuan(row) ? <div class="redbordererr">
+														<el-form-item label="" label-width="0px" prop={`normList.${index}.${column.columnAttributes.prop}`} rules={required}>
+															<el-input
+																type="number"
+																disabled={expandDataForm.normListBj || !row.bianji}
+																value={row[column.columnAttributes.prop]}
+																onInput={(val) => { row[column.columnAttributes.prop] = val }}
+																placeholder="请输入内容"
+															>
+															</el-input>
+														</el-form-item>
+													</div> : null
+												}
+											},
+											{
+												columnAttributes: {
+													label: '结算金额(元)',
+													prop: 'settleAmount',
+													width: "160px"
+												},
+												render: (h, { row, column, index }) => {
+													row.settleAmount = (((Number(row.normAmount || 0) * Number(row.settleNum || 0)) * 100) / 100).toFixed(2)
+													return this.panfuan(row) ? <div class="redbordererr">
+														{row.settleAmount}
+													</div> : null
+												}
+											},
+										]
+									}
+									return []
+								})(),
+								...(() => {
+									if (expandDataForm.orderType == 'REPAIR') {
+										return [
+											{
+												columnAttributes: {
+													label: '质保类型',
+													prop: 'label'
+												},
+												render: (h, { row, column, index }) => {
+													return this.panfuan(row) ? <div class="redbordererr">
+														<el-form-item label="" label-width="0px" prop={`normList.${index}.${column.columnAttributes.prop}`} rules={required}>
+															<el-select
+																disabled={expandDataForm.normListBj || !row.bianji}
+																value={row[column.columnAttributes.prop]}
+																onInput={(val) => { row[column.columnAttributes.prop] = val }}
+																onChange={(val) => {
+																	if (val) {
+																		var data = this.getflList(expandDataForm.gonglr, row).find(item => item.label == val)
+																		row.repairAmount = data.repairAmount
+																		row.normAmount = data.normAmount
+																		row.settleNormId = data.id
+																	} else {
+																		row.repairAmount = ""
+																		row.normAmount = ""
+																		row.settleNormId = ""
+																	}
+																}}
+																placeholder="请选择">
+																{this.getflList(expandDataForm.gonglr, row).map((item, index_) => <el-option key={index_} label={({ INSIDE: '保内', OUT: '保外' })[item.label]} value={item.label}></el-option>)}
+															</el-select>
+														</el-form-item>
+													</div> : null
+												}
+											},
+											{
+												columnAttributes: {
+													label: '上门费(元/单)',
+													prop: 'repairAmount',
+													width: '110'
+												},
+												render: (h, { row, column, index }) => {
+													return this.panfuan(row) ? <div class="redbordererr">
+														<el-form-item label="" label-width="0px" prop={`normList.${index}.${column.columnAttributes.prop}`} rules={required}>
+															<el-input
+																disabled={expandDataForm.normListBj || !row.bianji}
+																type="number"
+																value={row[column.columnAttributes.prop]}
+																onInput={(val) => { row[column.columnAttributes.prop] = val }}
+																placeholder="请输入内容"
+															>
+															</el-input>
+														</el-form-item>
+													</div> : null
+												}
+											},
+											{
+												columnAttributes: {
+													label: '维修费结算比例%',
+													prop: 'normAmount',
+													width: '110'
+												},
+												render: (h, { row, column, index }) => {
+													return this.panfuan(row) ? <div class="redbordererr">
+														{row[column.columnAttributes.prop]}%
+													</div> : null
+												}
+											},
+											{
+												columnAttributes: {
+													label: '维修费用结算',
+													prop: 'repairNormAmount',
+													width: '110'
+												},
+												render: (h, { row, column, index }) => {
+													return this.panfuan(row) ? <div class="redbordererr">
+														<el-form-item label="" label-width="0px" prop={`normList.${index}.${column.columnAttributes.prop}`} rules={required}>
+															<el-input
+																disabled={expandDataForm.normListBj || !row.bianji}
+																type="number"
+																value={row[column.columnAttributes.prop]}
+																onInput={(val) => { row[column.columnAttributes.prop] = val }}
+																placeholder="请输入内容"
+															>
+															</el-input>
+														</el-form-item>
+													</div> : null
+												}
+											},
+											{
+												columnAttributes: {
+													label: '结算数量',
+													prop: 'settleNum',
+													width: "160px"
+												},
+												render: (h, { row, column, index }) => {
+													return this.panfuan(row) ? <div class="redbordererr">
+														<el-form-item label="" label-width="0px" prop={`normList.${index}.${column.columnAttributes.prop}`} rules={required}>
+															<el-input
+																type="number"
+																disabled={expandDataForm.normListBj || !row.bianji}
+																value={row[column.columnAttributes.prop]}
+																onInput={(val) => { row[column.columnAttributes.prop] = val }}
+																placeholder="请输入内容"
+															>
+															</el-input>
+														</el-form-item>
+													</div> : null
+												}
+											},
+											{
+												columnAttributes: {
+													label: '结算金额(元)',
+													prop: 'settleAmount',
+													width: "160px"
+												},
+												render: (h, { row, column, index }) => {
+													row.settleAmount = (((Number(row.repairAmount || 0) + (Number(row.normAmount || 0) / 100) * Number(row.repairNormAmount || 0) * Number(row.settleNum || 0)) * 100) / 100).toFixed(2)
+													return this.panfuan(row) ? <div class="redbordererr">
+														{row.settleAmount}
+													</div> : null
+												}
+											},
+										]
+									}
+									return []
+								})(),
+								{
+									columnAttributes: {
+										label: '备注',
+										prop: 'remark',
+										width: "200px"
+									},
+									render: (h, { row, column, index }) => {
+										return this.panfuan(row) ? <div class="redbordererr">
+											<el-form-item label="" label-width="0px">
+												<el-input
+													disabled={expandDataForm.normListBj || !row.bianji}
+													value={row[column.columnAttributes.prop]}
+													onInput={(val) => { row[column.columnAttributes.prop] = val }}
+													placeholder="请输入内容"
+												>
+												</el-input>
+											</el-form-item>
+										</div> : null
+									}
+								},
+								{
+									columnAttributes: {
+										label: '工程师名称',
+										prop: 'workerName',
+										width: "140px"
+									},
+									render: (h, { row, column, index }) => {
+										return <div class="redbordererr" style="padding:0 6px;display:flex;align-items:center;">
+											{expandDataForm?.normList[row.pfuqinid]?.workerList?.[row.zijideid]?.[column.columnAttributes.prop]}
+										</div>
+									}
+								},
+								{
+									columnAttributes: {
+										label: '联系电话',
+										prop: 'workerMobile',
+										width: '140px'
+									},
+									render: (h, { row, column, index }) => {
+										return <div class="redbordererr" style="padding:0 6px;display:flex;align-items:center;">
+											{expandDataForm?.normList[row.pfuqinid]?.workerList?.[row.zijideid]?.[column.columnAttributes.prop]}
+										</div>
+									}
+								},
+								{
+									columnAttributes: {
+										label: '结算费用',
+										prop: 'settleAmount',
+										width: "140px"
+									},
+									render: (h, { row, column, index }) => {
+										return <div class="redbordererr">
+											<el-form-item label="" label-width="0px" prop={`normList.${row.pfuqinid}.workerList.${row.zijideid}.${column.columnAttributes.prop}`} rules={required}>
+												<el-input
+													type="number"
+													disabled={!expandDataForm.normList[row.pfuqinid].bianji || expandDataForm?.normList[row.pfuqinid]?.workerList?.[row.zijideid]?.["poolStatus"] == "YES"}
+													value={expandDataForm?.normList[row.pfuqinid]?.workerList?.[row.zijideid]?.[column.columnAttributes.prop]}
+													onInput={(val) => {
+														expandDataForm.normList[row.pfuqinid].workerList[row.zijideid][column.columnAttributes.prop] = val
+													}}
+													placeholder="请输入内容"
+												>
+												</el-input>
+											</el-form-item>
+										</div>
+									}
+								}, {
+									columnAttributes: {
+										label: '确认人',
+										prop: 'confirmBy',
+										width: "100px"
+									},
+									render: (h, { row, column, index }) => {
+										return <div class="redbordererr" style="padding:0 6px;display:flex;align-items:center;">
+											{expandDataForm?.normList[row.pfuqinid]?.workerList?.[row.zijideid]?.[column.columnAttributes.prop]}
+										</div>
+									}
+								},
+								{
+									columnAttributes: {
+										label: '确认时间',
+										prop: 'confirmTime',
+										width: "140px"
+									},
+									render: (h, { row, column, index }) => {
+										return <div class="redbordererr" style="padding:0 6px;display:flex;align-items:center;">
+											{expandDataForm?.normList[row.pfuqinid]?.workerList?.[row.zijideid]?.[column.columnAttributes.prop]}
+										</div>
+									}
+								},
+								{
+									columnAttributes: {
+										label: '汇总状态',
+										prop: 'poolStatus',
+										width: "100px"
+									},
+									render: (h, { row, column, index }) => {
+										return <div class="redbordererr" style="padding:0 6px;display:flex;align-items:center;">
+											{({ "NO": "未汇总", "YES": "已汇总" })[expandDataForm?.normList[row.pfuqinid]?.workerList?.[row.zijideid]?.[column.columnAttributes.prop]]}
+										</div>
+									}
+								}, {
+									columnAttributes: {
+										label: '操作',
+										prop: '',
+										fixed: 'right',
+										width: "120px"
+									},
+									render: (h, { row, column, index }) => {
+										return expandDataForm.settleStatus == 'YWG' || (expandDataForm.settleStatus == 'YJS' && expandDataForm?.normList[row.pfuqinid]?.workerList?.find(item => item.poolStatus == "NO")) ? (<div class="redbordererr redbordererranniuright" style="padding:0 6px;">
+											{expandDataForm.normList[row.pfuqinid].bianji ? <el-button type="text" onClick={
+												() => {
+													var yjsje = [0, 0, 0, expandDataForm?.normList[row.pfuqinid]?.workerList?.filter(item => item.poolStatus == "YES").map(item => item.settleAmount)].reduce(function (prev, curr, idx, arr) {
+														return prev + curr;
+													})
+													var nou = expandDataForm?.normList[row.pfuqinid]?.workerList?.filter(item => item.poolStatus == "NO")
+													var qian = ((((Number(expandDataForm?.normList[row.pfuqinid]["settleAmount"]) - yjsje) / nou.length) * 100) / 100).toFixed(2)
+													var rongyu = ((Number(expandDataForm?.normList[row.pfuqinid]["settleAmount"]) - yjsje) - (qian * nou.length)).toFixed(2)
+													nou.map((item, index) => {
+														if (index === 0) {
+															item.settleAmount = (Number(qian) + Number(rongyu)).toFixed(2)
+														} else {
+															item.settleAmount = qian
+														}
+													})
+												}
+											}>平分费用</el-button> : null}
+											{expandDataForm.normList[row.pfuqinid].bianji ? <el-button type="text" onClick={
+												() => {
+													this.itemOrderBaseSettleNormReset(rowZhu, "normList", () => {
+														expandDataForm.normList[row.pfuqinid].bianji = false
+													})
+												}
+											}>确定</el-button> : null}
+											{!expandDataForm.normList[row.pfuqinid].bianji ? <el-button type="text" onClick={
+												() => {
+													expandDataForm.normList[row.pfuqinid].bianji = true
+												}
+											}>修改</el-button> : null}
+											{!expandDataForm.showOtherNormList ? <el-button type="text" onClick={
+												() => {
+													expandDataForm.showOtherNormList = true
+												}
+											}>添加其他费用</el-button> : null}
+										</div>) : null
+									}
+								}]
+								return (
+									<zj-table
+										columns={columns}
+										table-data={formData.normList}
+										tableAttributes={{
+											'span-method': ({ row, column, rowIndex, columnIndex }) => {
+												if (columnIndex === columns.length - 1) {
+													if (row.zijideid == 0) {
+														return {
+															rowspan: formData.normList[row.pfuqinid].workerList?.length,
+															colspan: 1
+														};
+													} else {
+														return {
+															rowspan: 0,
+															colspan: 0
+														};
+													}
+												}
+											}
+										}}
+									/>
+								)
+							}
+						},
+						{
+							md: 24,
+							isShow: expandDataForm.showOtherNormList,
+							name: 'slot-component',
+							formItemAttributes: {
+								label: '其他费用结算',
+								prop: 'otherNormList',
+							},
+							render: (h, { props, onInput }) => {
+								var { formData } = props
+								var columns = [{
+									columnAttributes: {
+										label: '结算工单来源',
+										prop: 'channelId',
+										width: '110'
+									},
+									render: (h, { row, column, index }) => {
+										return this.panfuan(row) ? <div class="redbordererr">
+											<el-form-item label="" label-width="0px" prop={`normList.${index}.${column.columnAttributes.prop}`} rules={required}>
+												<el-select
+													disabled={expandDataForm.otherNormListBj || !row.bianji}
+													value={row[column.columnAttributes.prop]}
+													onInput={(val) => { row[column.columnAttributes.prop] = val }}
+													onChange={(val) => {
+														row.type = ""
+														row.label = ""
+														row.normAmount = ""
+														row.settleNormId = ""
+														row.settleNum = ""
+														if (val) {
+															var data = this.classifyListChuLi(expandDataForm.otherList, "orderChannelId", "orderChannelText").find(item => item.value == val)
+															row.channelText = data.label
+														} else {
+															row.channelText = ""
+														}
+													}}
+													placeholder="请选择">
+													{this.classifyListChuLi(expandDataForm.otherList, "orderChannelId", "orderChannelText").map((item, index_) => <el-option key={index_} label={item.label} value={item.value}></el-option>)}
+												</el-select>
+											</el-form-item>
+										</div> : null
+									}
+								},
+								{
+									columnAttributes: {
+										label: '费用类型',
+										prop: 'type'
+									},
+									render: (h, { row, column, index }) => {
+										return this.panfuan(row) ? <div class="redbordererr">
+											<el-form-item label="" label-width="0px">
+												<el-select
+													disabled={expandDataForm.otherNormListBj || !row.bianji}
+													value={row[column.columnAttributes.prop]}
+													onInput={(val) => { row[column.columnAttributes.prop] = val }}
+													onChange={(val) => {
+														row.label = ""
+														row.normAmount = ""
+														row.settleNormId = ""
+														row.settleNum = ""
+													}}
+													placeholder="请选择">
+													{this.classifyListChuLi(expandDataForm.otherList, "type", "typeName", (item) => item.orderChannelId == row.channelId).map((item, index_) => <el-option key={index_} label={item.label} value={item.value}></el-option>)}
+												</el-select>
+											</el-form-item>
+										</div> : null
+									}
+								},
+								{
+									columnAttributes: {
+										label: '规格',
+										prop: 'label'
+									},
+									render: (h, { row, column, index }) => {
+										return this.panfuan(row) ? <div class="redbordererr">
+											<el-form-item label="" label-width="0px">
+												<el-select
+													disabled={expandDataForm.otherNormListBj || !row.bianji}
+													value={row[column.columnAttributes.prop]}
+													onInput={(val) => { row[column.columnAttributes.prop] = val }}
+													onChange={(val) => {
+														row.settleNum = ""
+														if (val) {
+															var data = this.classifyListChuLi(expandDataForm.otherList, "label", "label", (item) => { return item.orderChannelId == row.channelId && item.type == row.type }, "normAmount", "id").find(item => item.label == val)
+															row.normAmount = data.normAmount
+															row.settleNormId = data.id
+														} else {
+															row.normAmount = ""
+															row.settleNormId = ""
+														}
+													}}
+													placeholder="请选择">
+													{this.classifyListChuLi(expandDataForm.otherList, "label", "label", (item) => item.orderChannelId == row.channelId && item.type == row.type).map((item, index_) => <el-option key={index_} label={item.label} value={item.value}></el-option>)}
+												</el-select>
+											</el-form-item>
+										</div> : null
+									}
+								},
+								{
+									columnAttributes: {
+										label: '单价(元/套)',
+										prop: 'normAmount',
+										width: "160px"
+									},
+								},
+								{
+									columnAttributes: {
+										label: '数量',
+										prop: 'settleNum',
+										width: "160px"
+									},
+									render: (h, { row, column, index }) => {
+										return this.panfuan(row) ? <div class="redbordererr">
+											<el-form-item label="" label-width="0px">
+												<el-input
+													type="number"
+													disabled={expandDataForm.otherNormListBj || !row.bianji}
+													value={row[column.columnAttributes.prop]}
+													onInput={(val) => { row[column.columnAttributes.prop] = val }}
+													placeholder="请输入内容"
+												>
+												</el-input>
+											</el-form-item>
+										</div> : null
+									}
+								},
+								{
+									columnAttributes: {
+										label: '结算金额(元)',
+										prop: 'settleAmount',
+										width: "160px"
+									},
+									render: (h, { row, column, index }) => {
+										row.settleAmount = (((Number(row.normAmount || 0) * Number(row.settleNum || 0)) * 100) / 100).toFixed(2)
+										return this.panfuan(row) ? <div class="redbordererr">
+											{row.settleAmount}
+										</div> : null
+									}
+								},
+								{
+									columnAttributes: {
+										label: '备注',
+										prop: 'remark',
+										width: "200px"
+									},
+									render: (h, { row, column, index }) => {
+										return this.panfuan(row) ? <div class="redbordererr">
+											<el-form-item label="" label-width="0px">
+												<el-input
+													disabled={expandDataForm.otherNormListBj || !row.bianji}
+													value={row[column.columnAttributes.prop]}
+													onInput={(val) => { row[column.columnAttributes.prop] = val }}
+													placeholder="请输入内容"
+												>
+												</el-input>
+											</el-form-item>
+										</div> : null
+									}
+								},
+								{
+									columnAttributes: {
+										label: '工程师名称',
+										prop: 'workerName',
+										width: "140px"
+									},
+									render: (h, { row, column, index }) => {
+										return <div class="redbordererr" style="padding:0 6px;display:flex;align-items:center;">
+											{expandDataForm?.otherNormList[row.pfuqinid]?.workerList?.[row.zijideid]?.[column.columnAttributes.prop]}
+										</div>
+									}
+								},
+								{
+									columnAttributes: {
+										label: '联系电话',
+										prop: 'workerMobile',
+										width: '140px'
+									},
+									render: (h, { row, column, index }) => {
+										return <div class="redbordererr" style="padding:0 6px;display:flex;align-items:center;">
+											{expandDataForm?.otherNormList[row.pfuqinid]?.workerList?.[row.zijideid]?.[column.columnAttributes.prop]}
+										</div>
+									}
+								},
+								{
+									columnAttributes: {
+										label: '结算费用',
+										prop: 'settleAmount',
+										width: "140px"
+									},
+									render: (h, { row, column, index }) => {
+										return <div class="redbordererr">
+											<el-form-item label="" label-width="0px" prop={`otherNormList.${row.pfuqinid}.workerList.${row.zijideid}.${column.columnAttributes.prop}`} rules={required}>
+												<el-input
+													type="number"
+													disabled={!expandDataForm.otherNormList[row.pfuqinid].bianji || expandDataForm?.otherNormList[row.pfuqinid]?.workerList?.[row.zijideid]?.["poolStatus"] == "YES"}
+													value={expandDataForm?.otherNormList[row.pfuqinid]?.workerList?.[row.zijideid]?.[column.columnAttributes.prop]}
+													onInput={(val) => {
+														expandDataForm.otherNormList[row.pfuqinid].workerList[row.zijideid][column.columnAttributes.prop] = val
+													}}
+													placeholder="请输入内容"
+												>
+												</el-input>
+											</el-form-item>
+										</div>
+									}
+								}, {
+									columnAttributes: {
+										label: '确认人',
+										prop: 'confirmBy',
+										width: "100px"
+									},
+									render: (h, { row, column, index }) => {
+										return <div class="redbordererr" style="padding:0 6px;display:flex;align-items:center;">
+											{expandDataForm?.otherNormList[row.pfuqinid]?.workerList?.[row.zijideid]?.[column.columnAttributes.prop]}
+										</div>
+									}
+								},
+								{
+									columnAttributes: {
+										label: '确认时间',
+										prop: 'confirmTime',
+										width: "140px"
+									},
+									render: (h, { row, column, index }) => {
+										return <div class="redbordererr" style="padding:0 6px;display:flex;align-items:center;">
+											{expandDataForm?.otherNormList[row.pfuqinid]?.workerList?.[row.zijideid]?.[column.columnAttributes.prop]}
+										</div>
+									}
+								},
+								{
+									columnAttributes: {
+										label: '汇总状态',
+										prop: 'poolStatus',
+										width: "100px"
+									},
+									render: (h, { row, column, index }) => {
+										return <div class="redbordererr" style="padding:0 6px;display:flex;align-items:center;">
+											{({ "NO": "未汇总", "YES": "已汇总" })[expandDataForm?.otherNormList[row.pfuqinid]?.workerList?.[row.zijideid]?.[column.columnAttributes.prop]]}
+										</div>
+									}
+								}, {
+									columnAttributes: {
+										label: '操作',
+										prop: '',
+										fixed: 'right',
+										width: "120px"
+									},
+									render: (h, { row, column, index }) => {
+										return expandDataForm.settleStatus == 'YWG' || (expandDataForm.settleStatus == 'YJS' && expandDataForm?.otherNormList[row.pfuqinid]?.workerList?.find(item => item.poolStatus == "NO")) ? (<div class="redbordererr redbordererranniuright" style="padding:0 6px;display:flex;align-items:center;">
+											{expandDataForm.otherNormList[row.pfuqinid].bianji ? <el-button type="text" onClick={
+												() => {
+													var yjsje = [0, 0, 0, expandDataForm?.otherNormList[row.pfuqinid]?.workerList?.filter(item => item.poolStatus == "YES").map(item => item.settleAmount)].reduce(function (prev, curr, idx, arr) {
+														return prev + curr;
+													})
+													var nou = expandDataForm?.otherNormList[row.pfuqinid]?.workerList?.filter(item => item.poolStatus == "NO")
+													var qian = ((((Number(expandDataForm?.otherNormList[row.pfuqinid]["settleAmount"]) - yjsje) / nou.length) * 100) / 100).toFixed(2)
+													var rongyu = ((Number(expandDataForm?.otherNormList[row.pfuqinid]["settleAmount"]) - yjsje) - (qian * nou.length)).toFixed(2)
+													nou.map((item, index) => {
+														if (index === 0) {
+															item.settleAmount = (Number(qian) + Number(rongyu)).toFixed(2)
+														} else {
+															item.settleAmount = qian
+														}
+													})
+												}
+											}>平分费用</el-button> : null}
+											{expandDataForm.otherNormList[row.pfuqinid].bianji ? <el-button type="text" onClick={
+												() => {
+													this.itemOrderBaseSettleNormReset(rowZhu, "otherNormList", () => {
+														expandDataForm.otherNormList[row.pfuqinid].bianji = false
+													})
+												}
+											}>确定</el-button> : null}
+											{!expandDataForm.otherNormList[row.pfuqinid].bianji ? <el-button type="text" onClick={
+												() => {
+													expandDataForm.otherNormList[row.pfuqinid].bianji = true
+												}
+											}>修改</el-button> : null}
+										</div>) : null
+									}
+								}]
+								return (
+									<zj-table
+										columns={columns}
+										table-data={formData.otherNormList}
+										tableAttributes={{
+											'span-method': ({ row, column, rowIndex, columnIndex }) => {
+												if (columnIndex === columns.length - 1) {
+													if (row.zijideid == 0) {
+														return {
+															rowspan: formData.otherNormList[row.pfuqinid].workerList?.length,
+															colspan: 1
+														};
+													} else {
+														return {
+															rowspan: 0,
+															colspan: 0
+														};
+													}
+												}
+											}
+										}}
+									/>
+								)
+							}
+						}]} />
+				</zj-form-container>
+			</div>) : null
+		},
+
+		itemOrderBaseSettleNormReset(data, type, cb) {
+			try {
+				data.expandData.normList.filter(item => !!item.id).map(item => {
+					if ([0, 0, 0, ...item.workerList?.map(val => Number(val.settleAmount))].reduce(function (prev, curr, idx, arr) {
+						return prev + curr;
+					}) !== Number(item.settleAmount)) {
+						throw new Error(`费用信息-${item.channelText}-${item.parentCategoryName}-${item.categoryName}-${item.label}:合计结算总金额与总金额不等`);
+					}
+				})
+				data.expandData.otherNormList.filter(item => !!item.id).map(item => {
+					if ([0, 0, 0, ...item.workerList?.map(val => Number(val.settleAmount))].reduce(function (prev, curr, idx, arr) {
+						return prev + curr;
+					}) !== Number(item.settleAmount)) {
+						throw new Error(`其他费用信息-${item.channelText}-${item.type}-${item.label}:合计结算总金额与总金额不等`);
+					}
+				})
+			} catch (err) {
+				this.$message.warning(err.message)
+				return
+			}
+
+			var { classifyList, gonglr, gonglv, otherList, normListBj, otherNormListBj, showOtherNormList, ...pam } = data.expandData;
+			var pams = {
+				...pam,
+				...(() => {
+					if (type == "normList") {
+						return {
+							normList: pam.normList.filter(item => !!item.id),
+						}
+					}
+					return {
+						normList: [],
+					}
+				})(),
+				...(() => {
+					if (type == "otherNormList") {
+						return {
+							otherNormList: pam.otherNormList.filter(item => !!item.id),
+						}
+					}
+					return {
+						otherNormList: [],
+					}
+				})(),
+			};
+			([orderBaseSettleNormConfirm, orderBaseSettleNormReset])[pams[type]?.map(item => item.workerList?.find(resdata => !!resdata.settleOrderId))?.find(item => item) ? 1 : 0](pams).then(res => {
+				orderBaseSettleNormDetail2({
+					id: data.id,
+					orderProductId: data.pgOrderProductId
+				}).then(res => {
+					this.zhuzhuang(res.data).then(res => {
+						data.expandData = res
+					})
+				})
+				cb && cb()
+				this.$message({
+					type: 'success',
+					message: '结算成功'
+				})
+			})
+		},
+
+		zhuzhuang(data) {
+			return new Promise((r, j) => {
+				var orderChannelId
+				var normList = []
+				var pfuqinid = 0
+				data.normListBj = false
+				data.otherNormListBj = false
+				data.showOtherNormList = false
+				data.normList.map((item, index) => {
+					if (!orderChannelId) { orderChannelId = item.orderChannelId }
+					item.settleNum = item.settleNum || ""
+					normList.push({ ...item, pfuqinid: pfuqinid, zijideid: 0, bianji: !item.workerList?.find(resdata => !!resdata.settleOrderId) })
+					item.workerList?.map((resdata, ind_) => {
+						if (resdata.settleOrderId) { data.normListBj = true }
+						if (ind_ !== 0) { normList.push({ pfuqinid: pfuqinid, zijideid: ind_ }) }
+						if (ind_ == item.workerList?.length - 1) { pfuqinid += (ind_ + 1) }
+					})
+				})
+				var otherNormList = []
+				var qtpfuqinid = 0
+				data.otherNormList.map((item, index) => {
+					item.settleNum = item.settleNum || ""
+					otherNormList.push({ ...item, pfuqinid: qtpfuqinid, zijideid: 0, bianji: !item.workerList?.find(resdata => !!resdata.settleOrderId) })
+					if (!data.showOtherNormList) {
+						data.showOtherNormList = !!item.workerList?.find(resdata => !!resdata.settleOrderId)
+					}
+					item.workerList?.map((resdata, ind_) => {
+						if (resdata.settleOrderId) { data.otherNormListBj = true }
+						if (ind_ !== 0) { otherNormList.push({ pfuqinid: qtpfuqinid, zijideid: ind_ }) }
+						if (ind_ == item.workerList?.length - 1) { qtpfuqinid += (ind_ + 1) }
+					})
+				})
+				Promise.all([
+					listPageV3({ "pageNum": 1, "pageSize": -1 }),
+					listPageV2Repair({ "pageNum": 1, "pageSize": -1 }),
+					settleNormInstallQuery({
+						settleNormType: data.orderType,
+						type: data.orderSmallType
+					}),
+					settleNormOtherQuery()
+				]).then(([res1, res2, res3, res4]) => {
+					r({
+						...data,
+						normList,
+						otherNormList,
+						gonglv: res1.data.records,
+						gonglr: res2.data.records,
+						classifyList: res3.data,
+						otherList: res4.data,
+					})
+
+				}).catch(j)
+			})
+		},
+
+		panfuan(item) {
+			if (!!item.id) {
+				return true
+			} else {
+				return false
+			}
+		},
+
+		classifyListChuLi(list, value, label, func, ...keys) {
+			var obj = {};
+			list.map(item => {
+				if (func && !func(item)) {
+					return
+				}
+				obj[item[value]] = {
+					label: item[label]
+				}
+				for (var key of keys) {
+					obj[item[value]][key] = item[key]
+				}
+			})
+			return Object.keys(obj).map(value => {
+				return {
+					value: value,
+					...obj[value]
+				}
+			})
+		},
+
+		getflList(list = [], row = {},) {
+			return list.filter(item => (
+				item.type == row.type &&
+				item.parentCategoryId == row.parentCategoryId &&
+				item.categoryId == row.categoryId
+			))
+		},
+
+	}
+}
+</script>
+
+<style lang="scss">
+.redbordererranniuright {
+	.el-button {
+		margin-left: 0px;
+		margin-right: 10px;
+	}
+}
+</style>

+ 1 - 3
src/views/workOrder/workOrderPool/detailModule/SettleAccounts/index.vue

@@ -18,11 +18,9 @@
 </template>
 
 <script>
-import { getClassifyList } from '@/api/goods'
-import { required, mobileRequired, mobile, httpUrl, email } from '@/components/template/rules_verify.js'
+import { required } from '@/components/template/rules_verify.js'
 import { listPageV2 } from "@/api/workOrder/settlementStandardInstall";
 import { listPageV2 as listPageV2Repair } from "@/api/workOrder/settlementStandardRepair";
-import { listPageV2 as listPageV2Other } from "@/api/workOrder/settlementStandardOther";
 import { orderBaseSettleNormDetail, orderBaseSettleNormConfirm, settleNormInstallQuery, settleNormOtherQuery, orderBaseSettleNormReset } from "@/api/workOrderPool.js";
 import { EventBus } from '@/utils/eventBus'
 export default {

+ 2 - 2
src/views/workOrder/workOrderPool/detailModule/workOrderInfo/index.vue

@@ -9,7 +9,7 @@
       >
         <!-- 派工信息 创建不需要 -->
         <zj-form-module v-if="id" title="派工信息" label-width="90px" :form-data="orderInfo" :form-items="dispatchInfo">
-          <div slot="internal-bottom">
+          <div slot="internal-bottom" style="text-align: right;">
             <copy-info text="复制工单信息" :info="dispatchInfo" :order-info="orderInfo" />
           </div>
           <div slot="right" style="width: 55%; position: relative">
@@ -33,7 +33,7 @@
           :form-items="workOrderType == 1 ? product_wb : product"
         />
         <!-- 其它信息 -->
-        <zj-form-module title="其它信息" :form-data="orderInfo" :form-items="otherInfo" />
+        <!-- <zj-form-module title="其它信息" :form-data="orderInfo" :form-items="otherInfo" /> -->
         <!-- 派单信息 -->
         <zj-form-module title="派单信息" label-width="100px" :form-data="orderInfo" :form-items="pandanxinxi" />
       </zj-form-container>

+ 18 - 2
src/views/workOrder/workOrderPool/detailModule/workOrderInfo/mixins/basicInfo.js

@@ -138,7 +138,7 @@ export default {
         {
           isShow: this.formOptions.gpsAddress.isShow,
           name: 'el-select',
-          md: 7,
+          md: 6,
           formItemAttributes: {
             label: '客户地址', //省
             prop: 'provinceId',
@@ -234,7 +234,7 @@ export default {
         {
           isShow: this.formOptions.gpsAddress.isShow,
           name: 'slot-component',
-          md: 2,
+          md: 3,
           formItemAttributes: {
             'label-width': '0px',
             prop: '',
@@ -302,6 +302,22 @@ export default {
           formItemAttributes: { label: '', prop: 'address', 'label-width': '0px', rules: this.formOptions.address.isRules },
           attributes: { disabled: !this.formOptions.address.isEdit, placeholder: '详细地址' }
         },
+        {
+          isShow: this.formOptions.remark.isShow && !this.id,
+          name: 'el-input',
+          md: 24,
+          attributes: {
+            disabled: !this.formOptions.remark.isEdit,
+            type: 'textarea',
+            rows: 3,
+            placeholder: '请输入'
+          },
+          formItemAttributes: {
+            label: '备注',
+            prop: 'remark',
+            rules: this.formOptions.remark.isRules
+          }
+        }
       ]
     }
   },

+ 31 - 14
src/views/workOrder/workOrderPool/detailModule/workOrderInfo/mixins/dispatchInfo.js

@@ -59,15 +59,16 @@ export default {
           md: 24,
           attributes: { disabled: true, placeholder: '请输入' },
           formItemAttributes: { label: '工单单号', prop: 'id' },
-          append: (h, { props, onInput }) => {
-            var { value } = props
-            return <copyInfo
-              btnys={true}
-              slot="append"
-              text="复制"
-              columnCopyClass="columnCopyClass_cp_888"
-              cpText={value}
-            ></copyInfo>
+          slots:{
+            append: (h, { props, onInput }) => {
+              return <copyInfo
+                btnys={true}
+                slot="append"
+                text="复制"
+                columnCopyClass="columnCopyClass_cp_888aa"
+                cpText={props?.formData?.id}
+              ></copyInfo>
+            }
           }
         },
         {
@@ -92,25 +93,25 @@ export default {
         },
         {
           name: 'el-input',
-          md: 24,
+          md: 12,
           attributes: { disabled: true, placeholder: '请选择' },
           formItemAttributes: { label: '派工状态', prop: 'orderStatusText' }
         },
         {
           name: 'el-input',
-          md: 24,
+          md: 12,
           attributes: { disabled: true, placeholder: '请输入' },
           formItemAttributes: { label: '创建时间', prop: 'createTime' }
         },
         {
           name: 'el-input',
-          md: 24,
+          md: 12,
           attributes: { disabled: true, placeholder: '请输入' },
           formItemAttributes: { label: '派单时间', prop: 'dispatchTime' }
         },
         {
           name: 'el-input',
-          md: 24,
+          md: 12,
           attributes: { disabled: true, placeholder: '请输入' },
           formItemAttributes: { label: '接单时间', prop: 'workerReceTime' }
         },
@@ -144,7 +145,23 @@ export default {
             })
           })
           return list
-        })()
+        })(),
+        {
+          isShow: this.formOptions.remark.isShow && !!this.id,
+          name: 'el-input',
+          md: 24,
+          attributes: {
+            disabled: !this.formOptions.remark.isEdit,
+            type: 'textarea',
+            rows: 3,
+            placeholder: '请输入'
+          },
+          formItemAttributes: {
+            label: '备注',
+            prop: 'remark',
+            rules: this.formOptions.remark.isRules
+          }
+        }
       ]
     }
   },