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

Merge remote-tracking branch 'origin/dev' into dev

002959 пре 11 месеци
родитељ
комит
5b0227d6d0
78 измењених фајлова са 7412 додато и 1172 уклоњено
  1. 1 0
      package.json
  2. 7 1
      public/index.html
  3. 22 8
      src/App.vue
  4. 78 0
      src/api/business/as/after-sales.js
  5. 33 0
      src/api/business/as/afterSalesUser.js
  6. 17 0
      src/api/business/as/assignAuthority.js
  7. 7 7
      src/api/business/as/hospital.js
  8. 64 1
      src/api/business/as/problemInfo.js
  9. 8 0
      src/api/business/purchase/apply.js
  10. 80 0
      src/api/ctyc/info.js
  11. 7 0
      src/api/expend/expendMx.js
  12. 76 0
      src/api/material/extend/material.js
  13. 222 0
      src/components/BatchImport/indexa.vue
  14. 2 1
      src/components/super-form/index.vue
  15. 4 1
      src/main.js
  16. 5 2
      src/permission.js
  17. 80 2
      src/router/index.js
  18. 5 0
      src/store/getters.js
  19. 3 1
      src/store/index.js
  20. 55 0
      src/store/modules/salesUser.js
  21. 1 1
      src/utils/request.js
  22. 28 17
      src/views/WMS/historical-route/index.vue
  23. 34 0
      src/views/business/as/after-sales/components/format-value/index.vue
  24. 51 0
      src/views/business/as/after-sales/components/image-preview/index.vue
  25. 58 2
      src/views/business/as/after-sales/components/image-upload/index.vue
  26. 27 5
      src/views/business/as/after-sales/contact-us/index.vue
  27. 27 5
      src/views/business/as/after-sales/feedback/columns.js
  28. 99 17
      src/views/business/as/after-sales/feedback/index.vue
  29. 47 1
      src/views/business/as/after-sales/index.vue
  30. 36 0
      src/views/business/as/after-sales/progress/columns.js
  31. 300 3
      src/views/business/as/after-sales/progress/details.vue
  32. 129 12
      src/views/business/as/after-sales/progress/index.vue
  33. 40 17
      src/views/business/as/after-sales/user/bindingInfo.vue
  34. 8 3
      src/views/business/as/after-sales/user/columns.js
  35. 52 4
      src/views/business/as/after-sales/user/index.vue
  36. 45 12
      src/views/business/as/after-sales/user/login.vue
  37. 19 6
      src/views/business/as/afterAalesProblemAnalysis/index.vue
  38. 255 0
      src/views/business/as/afterSalesUser/index.vue
  39. 98 40
      src/views/business/as/hospital/assignAuthority/index.vue
  40. 152 15
      src/views/business/as/hospital/index.vue
  41. 112 81
      src/views/business/as/problemInfo/detail.vue
  42. 476 198
      src/views/business/as/problemInfo/index.vue
  43. 49 31
      src/views/business/bid/detail/bidingInfoDetail.vue
  44. 12 31
      src/views/business/bid/detail/detail.vue
  45. 57 10
      src/views/business/bid/index/biding.vue
  46. 10 18
      src/views/business/bid/rulesDetail/detail.vue
  47. 28 12
      src/views/business/bid/subscriptionRules/index.vue
  48. 1 0
      src/views/business/newsLink/index.vue
  49. 707 0
      src/views/ctyc/info/approval.vue
  50. 53 0
      src/views/ctyc/info/approvalMain.vue
  51. 742 0
      src/views/ctyc/info/approved.vue
  52. 297 0
      src/views/ctyc/info/index.vue
  53. 5 1
      src/views/expend/customerExpend/columns.js
  54. 103 4
      src/views/expend/expendMx.vue
  55. 55 4
      src/views/expend/expendMxDetail.vue
  56. 1 1
      src/views/material/basicFile/index.vue
  57. 197 193
      src/views/material/changeApply/add/column.js
  58. 248 0
      src/views/material/extend/annex.vue
  59. 272 0
      src/views/material/extend/baseinfo.vue
  60. 121 0
      src/views/material/extend/detailMain.vue
  61. 4 0
      src/views/material/extend/event/event-bus.js
  62. 0 0
      src/views/material/extend/indexMain.vue
  63. 756 0
      src/views/material/extend/pictures.vue
  64. 116 0
      src/views/material/extend/qualifications.vue
  65. 132 0
      src/views/material/extend/sale.vue
  66. 308 309
      src/views/material/requisition/details/columns.js
  67. 50 20
      src/views/purchase/PurchaseDemandList/add.vue
  68. 20 16
      src/views/purchase/apply/add/columns.js
  69. 39 1
      src/views/purchase/apply/add/index.vue
  70. 21 17
      src/views/purchase/apply/copy/columns.js
  71. 34 1
      src/views/purchase/apply/copy/index.vue
  72. 20 16
      src/views/purchase/apply/edit/columns.js
  73. 40 1
      src/views/purchase/apply/edit/index.vue
  74. 7 5
      src/views/purchase/apply/see/columns.js
  75. 14 2
      src/views/purchase/purchase-order/add/column.js
  76. 7 4
      src/views/purchase/purchase-order/index.vue
  77. 13 10
      src/views/purchase/workSpace/columns.js
  78. 3 2
      vue.config.js

+ 1 - 0
package.json

@@ -55,6 +55,7 @@
     "js-beautify": "1.13.0",
     "js-cookie": "3.0.1",
     "jsencrypt": "3.0.0-rc.1",
+    "jszip": "^3.10.1",
     "lodash": "^4.17.21",
     "nprogress": "0.2.0",
     "print-js": "^1.6.0",

+ 7 - 1
public/index.html

@@ -214,4 +214,10 @@
   </div>
 </body>
 
-</html>
+</html>
+
+<!-- <script src="https://unpkg.com/vconsole@latest/dist/vconsole.min.js"></script>
+<script>
+  // VConsole 默认会挂载到 `window.VConsole` 上
+  var vConsole = new window.VConsole();
+</script> -->

+ 22 - 8
src/App.vue

@@ -16,14 +16,18 @@ import ThemePicker from "@/components/ThemePicker";
 export default {
   name: "App",
   components: { ThemePicker },
-    metaInfo() {
-        return {
-            title: this.$store.state.settings.dynamicTitle && this.$store.state.settings.title,
-            titleTemplate: title => {
-                return title ? `${title} - ${process.env.VUE_APP_TITLE}` : process.env.VUE_APP_TITLE
-            }
-        }
-    }
+  metaInfo() {
+    return {
+      title:
+        this.$store.state.settings.dynamicTitle &&
+        this.$store.state.settings.title,
+      titleTemplate: (title) => {
+        return title
+          ? `${title} - ${process.env.VUE_APP_TITLE}`
+          : process.env.VUE_APP_TITLE;
+      },
+    };
+  },
 };
 </script>
 <style scoped>
@@ -31,3 +35,13 @@ export default {
   display: none;
 }
 </style>
+<style lang="scss">
+// :v-deep.el-scrollbar .el-scrollbar__bar {
+//   opacity: 1 !important;
+// }
+.el-scrollbar {
+  > .el-scrollbar__bar {
+    opacity: 1 !important;
+  }
+}
+</style>

+ 78 - 0
src/api/business/as/after-sales.js

@@ -0,0 +1,78 @@
+// SPD售后问题收集 ——移动端
+import request from "@/utils/request";
+
+// 查询项目信息
+export function ProjectInfo(params) {
+  return request({
+    url: `/mk/as/hospital/getById/${params.id}`,
+    method: "GET",
+    // params,
+  });
+}
+
+
+// 判断是否第一次登录
+export function FirstLogin(params) {
+  return request({
+    url: `/mk/as/afterSalesUser/getByPhone`,
+    method: "GET",
+    params,
+  });
+}
+
+// 新增用户
+export function AddUser(data) {
+  return request({
+    url: "/mk/as/afterSalesUser/add",
+    method: "POST",
+    data: data,
+  });
+}
+
+// 获取用户信息
+export function GetUser(params) {
+  return request({
+    url: `/mk/as/afterSalesUser/getById/${params.id}`,
+    method: "GET",
+  });
+}
+
+
+// 修改用户信息
+export function EditUser(data) {
+  return request({
+    url: "/mk/as/afterSalesUser/edit",
+    method: "POST",
+    data: data,
+  });
+}
+
+
+// 新增问题
+export function AddProblem(data, params) {
+  return request({
+    url: "/mk/as/problem/add",
+    method: "POST",
+    data: data,
+    params,
+  });
+}
+
+// 问题列表
+export function ProblemList(params) {
+  return request({
+    url: `/mk/as/problem/getByUserId/${params.userId}`,
+    method: "GET",
+    // params,
+  });
+}
+
+// 问题详情
+export function ProblemItem(params) {
+  return request({
+    url: `/mk/as/problem/getDetail/${params.id}`,
+    method: "GET",
+    // params,
+  });
+}
+

+ 33 - 0
src/api/business/as/afterSalesUser.js

@@ -0,0 +1,33 @@
+import request from "@/utils/request";
+
+
+//获取售后问题用户列表
+export function getList(param) {
+  return request({
+    url: `/mk/as/afterSalesUser/list`,
+    method: 'get',
+    params: param
+  })
+}
+
+export function deleteById(param) {
+  return request({
+    url: `/mk/as/afterSalesUser/deleteById/${param}`,
+    method: 'delete',
+  })
+}
+
+export function edit(data) {
+  return request({
+    url: `/mk/as/afterSalesUser/edit`,
+    method: 'post',
+    data: data
+  })
+}
+
+export function getUserProjectList() {
+  return request({
+    url: `/mk/as/afterSalesUser/getUserProjectList`,
+    method: 'get',
+  })
+}

+ 17 - 0
src/api/business/as/assignAuthority.js

@@ -9,6 +9,13 @@ export function userList(param) {
     params: param
   })
 }
+export function userAllList(param) {
+  return request({
+    url: `/mk/as/assignAuthority/userAllList`,
+    method: 'get',
+    params: param
+  })
+}
 //新增分配权限人员
 export function addUser(data) {
   return request({
@@ -35,3 +42,13 @@ export function edit(data) {
     data: data
   })
 }
+
+//批量删除已分配权限人员
+export function removeByIdList(data) {
+  return request({
+    url: `/mk/as/assignAuthority/removeByIdList`,
+    method: 'delete',
+    data: data
+  })
+}
+

+ 7 - 7
src/api/business/as/hospital.js

@@ -34,10 +34,10 @@ export function remove(id) {
   })
 }
 
-// //查询医院和处理人列表
-// export function getHospitalAndProcessor() {
-//   return request({
-//     url: '/mk/as/hospital/getHospitalAndProcessor',
-//     method: 'get',
-//   })
-// }
+//查询微信群列表
+export function getWeChatRoomList() {
+  return request({
+    url: '/mk/as/chatRoom/getWeChatRoomList',
+    method: 'get',
+  })
+}

+ 64 - 1
src/api/business/as/problemInfo.js

@@ -19,7 +19,7 @@ export function remove(data) {
   })
 }
 
-//修改删除售后状态
+//修改售后问题状态
 export function updateStage(data) {
   return request({
     url: '/mk/as/problem/updateStage',
@@ -68,5 +68,68 @@ export function getQuestionerList() {
   })
 }
 
+export function updateStageProblem(data) {
+  return request({
+    url: `/mk/as/problem/updateStageProblem`,
+    method: 'post',
+    data: data
+  })
+}
 
+export function getWorkOrderProcessorList() {
+  return request({
+    url: `/mk/as/problem/getWorkOrderProcessorList`,
+    method: 'get',
+  })
+}
 
+export function addProblem(data,params) {
+  return request({
+    url: `/mk/as/problem/add`,
+    method: 'post',
+    data: data,
+    params,
+  })
+}
+
+//获取全部售后问题项目/医院列表
+export function getProjectSourceOptions() {
+  return request({
+    url: `/mk/as/hospital/getAllList`,
+    method: 'get',
+  })
+}
+
+//根据项目获取提问人列表
+export function getQuestionerOptions(hospitalId) {
+  return request({
+    url: `/mk/as/afterSalesUser/getListByHospitalId/${hospitalId}`,
+    method: 'get',
+  })
+}
+
+//根据项目/医院id获取处理人列表
+export function getProcessorOptions(param) {
+  return request({
+    url: `/mk/as/assignAuthority/getByHid/${param}`,
+    method: 'get',
+  })
+}
+
+
+
+//导入文件
+export function fileImport(data) {
+  return request({
+    url: '/mk/as/problem/upload',
+    method: 'post',
+    data: data
+  })
+}
+
+export function getAllProcessorDataList() {
+  return request({
+    url: '/mk/as/assignAuthority/getAllAssignAuthority',
+    method: 'get',
+  })
+}

+ 8 - 0
src/api/business/purchase/apply.js

@@ -83,4 +83,12 @@ export function BATCHPRICE(data) {
     method: "POST",
     data: data,
   });
+}
+// 复制批量获取调价类型、单价差、涨幅、预计年影响金额
+export function BATCHPRICEISEXIST(data) {
+  return request({
+    url: `/pu/price/catalogue/batchPriceIsExist`,
+    method: "POST",
+    data: data,
+  });
 }

+ 80 - 0
src/api/ctyc/info.js

@@ -0,0 +1,80 @@
+import request from '@/utils/request'
+
+// 查询合作企业列表
+export function listInfo(query) {
+  return request({
+    url: '/ctyc/info/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询合作企业详细
+export function getInfo(id) {
+  return request({
+    url: '/ctyc/info/' + id,
+    method: 'get'
+  })
+}
+
+// 新增合作企业
+export function addInfo(data) {
+  return request({
+    url: '/ctyc/info',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改合作企业
+export function updateInfo(data) {
+  return request({
+    url: '/ctyc/info',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除合作企业
+export function delInfo(id) {
+  return request({
+    url: '/ctyc/info/' + id,
+    method: 'delete'
+  })
+}
+
+// 获取天眼查合集详情信息
+export function getTycInfo(companyId) {
+  return request({
+    url: '/ctyc/info/getTycInfo/' + companyId,
+    method: 'get'
+  })
+}
+
+
+// 新增审阅信息
+export function addAlog(data) {
+  return request({
+    url: '/ctyc/alog',
+    method: 'post',
+    data: data
+  })
+}
+
+// 查询合作企业列表
+export function query(companyId) {
+  return request({
+    url: '/ctyc/alog/query/' + companyId,
+    method: 'get'
+  })
+}
+
+// 导入文件 
+export function fileImport(data) {
+  return request({
+    url: '/ctyc/info/imports',
+    method: 'post',
+    data: data
+  })
+}
+  

+ 7 - 0
src/api/expend/expendMx.js

@@ -64,4 +64,11 @@ export function divideDoc(data) {
     method: 'post',
     data: data
   })
+}
+// 取消拆单
+export function cancelDoc(sourceCode) {
+  return request({
+    url: `/pu/doc/regretDividing/${sourceCode}`,
+    method: 'get',
+  })
 }

+ 76 - 0
src/api/material/extend/material.js

@@ -0,0 +1,76 @@
+import request from '@/utils/request';
+
+// 获取基本信息
+export function getInfo(p1) {
+  return request({
+    url: '/system/material/details/'+p1,
+    method: 'get'
+  })
+}
+
+// 获取资质信息
+export function getMaterialQualifications(p1) {
+  return request({
+    url: '/detail/dept/getMaterialQualifications/'+p1,
+    method: 'get'
+  })
+}
+
+// 获取销售信息 三甲
+export function getSaleRankGrade(p1) {
+  return request({
+    url: '/detail/dept/getSaleRankGrade/'+p1,
+    method: 'get'
+  })
+}
+
+
+// 获取销售信息 三级
+export function getSaleRank(p1) {
+  return request({
+    url: '/detail/dept/getSaleRank/'+p1,
+    method: 'get'
+  })
+}
+
+
+// 产品库详情更新
+export function infoSave(data) {
+  return request({
+    url: "/detail/dept/infoSave",
+    method: "post",
+    data: data
+  });
+}
+
+// 物料适用科室详情
+export function getInfoSuitDeptByMaterialId(p1) {
+  return request({
+    url: '/detail/dept/getInfoSuitDeptByMaterialId/'+p1,
+    method: 'get'
+  })
+}
+
+// 物料图册详情
+export function getInfoPicturesByMaterialId(p1) {
+  return request({
+    url: '/detail/dept/getInfoPicturesByMaterialId/'+p1,
+    method: 'get'
+  })
+}
+
+// 物料附件科室详情
+export function getInfoAnnexByMaterialId(p1) {
+  return request({
+    url: '/detail/dept/getInfoAnnexByMaterialId/'+p1,
+    method: 'get'
+  })
+}
+
+// 获取文件信息
+export function readFile(p1) {
+  return request({
+    url: '/document/attachment/'+p1,
+    method: 'get'
+  })
+}

+ 222 - 0
src/components/BatchImport/indexa.vue

@@ -0,0 +1,222 @@
+<script>
+export default {
+  name: "BatchImport",
+  props: {
+    disabled: {
+      type: Boolean,
+      default: false,
+    },
+    limit: {
+      type: Number,
+      default: 1,
+    },
+    fileType: {
+      type: Array,
+      default: () => ["xls", "xlsx"],
+    },
+    size: {
+      type: String,
+      default: "mini",
+    },
+    isShowTip: {
+      type: Boolean,
+      default: true,
+    },
+    isTemplate: {
+      type: Boolean,
+      default: true,
+    },
+    fileSize: {
+      type: Number,
+      default: 100,
+    },
+  },
+  computed: {
+    // 是否显示提示
+    showTip() {
+      return this.isShowTip && (this.fileType || this.fileSize);
+    },
+    accept() {
+      return this.fileType.map((item) => `.${item}`).join(",");
+    },
+  },
+  data() {
+    return {
+      title: "导入",
+      visible: false,
+      loading: false,
+      fileList: [],
+      number: 0,
+    };
+  },
+  methods: {
+    // 确认上传
+    async submitUpload() {
+      if (this.fileList.length) {
+        this.$emit("import", this.fileList);
+      } else {
+        this.$notify.warning({
+          title: "警告",
+          message: "请上传文件之后在确认!",
+        });
+      }
+    },
+    // 模板下载
+    async templateDownload() {
+      this.$emit("temDownload");
+    },
+    //
+    beforeClose(done) {
+      this.fileList = [];
+      // 关闭前清空
+      done();
+    },
+    // 预览
+    handlePreview() {},
+    // 移除
+    handleRemove(file, fileList) {
+      this.fileList = fileList;
+    },
+    // 文件改变
+    onChange(file, fileList) {
+      this.fileList = fileList;
+      // 校检文件类型
+      if (this.fileType) {
+        const fileName = file.name.split(".");
+        const fileExt = fileName[fileName.length - 1];
+        console.log(fileExt, "fileExt");
+        console.log(
+          this.fileType.indexOf(fileExt),
+          "this.fileType.indexOf(fileExt)"
+        );
+        const isTypeOk = this.fileType.indexOf(fileExt) >= 0;
+        if (!isTypeOk) {
+          this.$modal.msgError(
+            `文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`
+          );
+          return this.fileList.pop();
+        }
+      }
+      // 校检文件大小
+      if (this.fileSize) {
+        const isLt = file.size / 1024 / 1024 < this.fileSize;
+        if (!isLt) {
+          this.$modal.msgError(`上传文件大小不能超过 ${this.fileSize} MB!`);
+          return this.fileList.pop();
+        }
+      }
+    },
+    setVisible(prop) {
+      this.visible = prop;
+      if (!prop) {
+        this.fileList = [];
+      }
+    },
+    open() {
+      this.setVisible(true);
+    },
+    // 取消
+    cancal() {
+      this.setVisible(false);
+    },
+    // 上传前校检格式和大小
+    handleBeforeUpload(file) {
+      console.log(file, "file");
+      // 校检文件类型
+      if (this.fileType) {
+        const fileName = file.name.split(".");
+        const fileExt = fileName[fileName.length - 1];
+        console.log(fileExt, "fileExt");
+        console.log(
+          this.fileType.indexOf(fileExt),
+          "this.fileType.indexOf(fileExt)"
+        );
+        const isTypeOk = this.fileType.indexOf(fileExt) >= 0;
+        if (!isTypeOk) {
+          this.$modal.msgError(
+            `文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`
+          );
+          return false;
+        }
+      }
+      // 校检文件大小
+      if (this.fileSize) {
+        const isLt = file.size / 1024 / 1024 < this.fileSize;
+        if (!isLt) {
+          this.$modal.msgError(`上传文件大小不能超过 ${this.fileSize} MB!`);
+          return false;
+        }
+      }
+      this.$modal.loading("正在上传文件,请稍候...");
+      this.number++;
+      return true;
+    },
+  },
+  created() {},
+};
+</script>
+
+<template>
+  <el-button
+    :disabled="disabled"
+    :size="size"
+    @click="open"
+    type="primary"
+    v-bind="$attrs"
+    v-on="$listeners"
+  >
+    {{ title }}
+    <el-dialog
+      :title="title"
+      :visible.sync="visible"
+      v-loading="loading"
+      width="35%"
+      center
+      :before-close="beforeClose"
+      append-to-body
+    >
+      <!-- :before-upload="handleBeforeUpload" -->
+      <el-upload
+        ref="upload"
+        action="#"
+        :on-preview="handlePreview"
+        :accept="accept"
+        :on-remove="handleRemove"
+        :file-list="fileList"
+        :auto-upload="false"
+        :on-change="onChange"
+        :limit="limit"
+        :disabled="disabled"
+        style="text-align: center"
+      >
+        <el-button slot="trigger" :size="size" type="primary"
+          >选取文件</el-button
+        >
+        <el-button
+          v-if="isTemplate"
+          style="margin-left: 10px"
+          :size="size"
+          type="success"
+          @click="templateDownload"
+          >下载模板</el-button
+        >
+        <div slot="tip" class="el-upload__tip" v-if="isShowTip">
+          请上传
+          <template v-if="fileSize">
+            大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b>
+          </template>
+          <template v-if="fileType">
+            格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b>
+          </template>
+        </div>
+      </el-upload>
+
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitUpload" :size="size"
+          >确 定</el-button
+        >
+        <el-button @click="cancal" :size="size">取 消</el-button>
+      </div>
+    </el-dialog>
+  </el-button>
+</template>

+ 2 - 1
src/components/super-form/index.vue

@@ -127,10 +127,11 @@ export default {
                 :title="item.title"
                 v-model="innerValue[item.key]"
                 :source.sync="innerValue"
-                :disabled="$attrs.disabled"
+                :disabled="$attrs.disabled || attr.disabled"
                 style="width: 100%"
               >
               </component>
+
               <component
                 v-else-if="attr.is === 'el-popover-multiple-select-v2'"
                 v-bind="attr"

+ 4 - 1
src/main.js

@@ -74,7 +74,9 @@ import onlyNumber from '@/views/business/ehr/directive/el-input';
 // 引入和风天气图标
 import 'qweather-icons/font/qweather-icons.css'
 
-import { NavBar, Form, Field, Button, ActionSheet, Cell, Sticky, Uploader } from "vant";
+import {
+  NavBar, Form, Field, Button, ActionSheet, Cell, Sticky, Uploader, Toast
+} from "vant";
 
 // 全局方法挂载
 Vue.prototype.getDicts = getDicts;
@@ -92,6 +94,7 @@ Vue.prototype.$init = {
   rules: initRules,
   page: initPage,
 };
+Vue.prototype.$toast = Toast;
 
 // 全局组件挂载
 

+ 5 - 2
src/permission.js

@@ -12,7 +12,10 @@ const whiteList = ['/login', '/register', '/test01', '/ehrentrance', '/contractB
   '/business/ehr/ehrpm-entrance', '/canteenAddFood', '/canteenAddMenu', '/menuScreen',
   '/foodScreen', '/business/wms/historical-route', '/business/SupAtttachment',
   '/business/purchase/form/transferOrder/bipPull-entrance', '/contractDetail',
-  '/spdAddQuestion', '/business/wms/ProductMarking']
+  '/spdAddQuestion', '/business/wms/ProductMarking',
+]
+
+const whiteListName = ['asLogin', "afterSales", "Feedback", "Progress", "UpdateInfo"]
 
 router.beforeEach((to, from, next) => {
   NProgress.start()
@@ -45,7 +48,7 @@ router.beforeEach((to, from, next) => {
     }
   } else {
     // 没有token
-    if (whiteList.indexOf(to.path) !== -1) {
+    if (whiteList.indexOf(to.path) !== -1 || whiteListName.indexOf(to.name) !== -1) {
       // 在免登录白名单,直接进入
       next()
     } else {

+ 80 - 2
src/router/index.js

@@ -119,11 +119,16 @@ export const constantRoutes = [
     hidden: true
   },
   {
-    path: '/business/as/afterAalesProblemAnalysis/',
+    path: '/business/as/afterAalesProblemAnalysis',
     component: () => import('@/views/business/as/afterAalesProblemAnalysis/index'),
     hidden: true
   },
   {
+    path: '/business/as/afterSalesUser',
+    component: () => import('@/views/business/as/afterSalesUser/index'),
+    hidden: true
+  },
+  {
     path: '/business/newsLink',
     component: () => import('@/views/business/newsLink/index'),
     hidden: true
@@ -288,9 +293,12 @@ export const constantRoutes = [
     name: "afterSales",
     component: () => import('@/views/business/as/after-sales/index'),
     hidden: true,
+    meta: {
+      keepAlive: true // 需要缓存
+    }
   },
   {
-    path: '/after-sales/login',
+    path: '/after-sales/login/:id?',
     name: "asLogin",
     component: () => import('@/views/business/as/after-sales/user/login'),
     hidden: true,
@@ -316,6 +324,76 @@ export const constantRoutes = [
     component: () => import('@/views/business/as/after-sales/user/index'),
     hidden: true,
   },
+   // 合作企业
+   {
+    path: '/ctyc/info/index',
+    name: "Ctyc",
+    component: () => import('@/views/ctyc/info/index'),
+    hidden: true,
+  },
+  // 风险监控
+  {
+    path: '/ctyc/info/approvalMain',
+    name: "ApprovalMain",
+    component: () => import('@/views/ctyc/info/approvalMain'),
+    hidden: true,
+  },
+  // 风险监控-待审阅
+  {
+    path: '/ctyc/info/approval',
+    name: "Approval",
+    component: () => import('@/views/ctyc/info/approval'),
+    hidden: true,
+  },
+  // 风险监控-已审阅
+  {
+    path: '/ctyc/info/approved',
+    name: "Approved",
+    component: () => import('@/views/ctyc/info/approved'),
+    hidden: true,
+  },
+  // 产品清单-详情
+  {
+    path: '/material/extend/detailMain',
+    name: "MaterialDetailMain",
+    component: () => import('@/views/material/extend/detailMain'),
+    hidden: true,
+  },
+  // 产品清单-详情-基本信息
+  {
+    path: '/material/extend/baseinfo',
+    name: "MaterialBaseInfo",
+    component: () => import('@/views/material/extend/baseinfo'),
+    hidden: true,
+  },
+  // 产品清单-详情-物料图册
+  {
+    path: '/material/extend/pictures',
+    name: "MaterialPictures",
+    component: () => import('@/views/material/extend/pictures'),
+    hidden: true,
+  },
+  // 产品清单-详情-附件
+  {
+    path: '/material/extend/annex',
+    name: "MaterialAnnex",
+    component: () => import('@/views/material/extend/annex'),
+    hidden: true,
+  },
+  // 产品清单-详情-资质信息
+  {
+    path: '/material/extend/qualifications',
+    name: "MaterialQualifications",
+    component: () => import('@/views/material/extend/qualifications'),
+    hidden: true,
+  },
+  // 产品清单-详情-销售情况
+  {
+    path: '/material/extend/sale',
+    name: "MaterialSale",
+    component: () => import('@/views/material/extend/sale'),
+    hidden: true,
+  },
 ]
 
 

+ 5 - 0
src/store/getters.js

@@ -16,5 +16,10 @@ const getters = {
   defaultRoutes: state => state.permission.defaultRoutes,
   sidebarRouters: state => state.permission.sidebarRouters,
   query: state => state.query,
+  id: state => state.salesUser.id,
+  userName: state => state.salesUser.userName,
+  userPhone: state => state.salesUser.userPhone,
+  userProject: state => state.salesUser.userProject,
+  userRoom: state => state.salesUser.userRoom,
 }
 export default getters

+ 3 - 1
src/store/index.js

@@ -8,6 +8,7 @@ import permission from './modules/permission'
 import settings from './modules/settings'
 import getters from './getters'
 import query from './material/query'
+import salesUser from "./modules/salesUser"
 
 Vue.use(Vuex)
 
@@ -19,7 +20,8 @@ const store = new Vuex.Store({
     tagsView,
     permission,
     settings,
-    query
+    query,
+    salesUser
   },
   getters
 })

+ 55 - 0
src/store/modules/salesUser.js

@@ -0,0 +1,55 @@
+import Cookies from 'js-cookie'
+// SPD售后问题收集
+const salesUser = {
+  state: {
+    id: "",
+    userName: "",
+    userPhone: "",
+    userProject: "",
+    userRoom: "",
+    hospitalId: "",
+  },
+
+  mutations: {
+    SET_SALESID: (state, id) => {
+      state.id = id;
+    },
+    SET_SALESNAME: (state, userName) => {
+      state.userName = userName;
+    },
+    SET_SALESPHONE: (state, userPhone) => {
+      state.userPhone = userPhone;
+    },
+    SET_SALESPROJECT: (state, userProject) => {
+      state.userProject = userProject;
+    },
+    SET_SALESROOM: (state, userRoom) => {
+      state.userRoom = userRoom;
+    },
+    SET_HOSPITALID: (state, hospitalId) => {
+      state.hospitalId = hospitalId;
+    },
+  },
+  actions: {
+    // 获取信息
+    setSalesUser({ commit }, { data }) {
+      return new Promise((resolve, reject) => {
+        let { id, userName, userPhone, userProject, userRoom, hospitalId } = data;
+        Cookies.set('salesId', id);
+        Cookies.set('salesProId', hospitalId);
+        commit("SET_SALESID", id);
+        commit("SET_SALESNAME", userName);
+        commit("SET_SALESPHONE", userPhone);
+        commit("SET_SALESPROJECT", userProject);
+        commit("SET_SALESROOM", userRoom);
+        commit("SET_HOSPITALID", hospitalId);
+        resolve()
+      })
+
+    },
+
+
+  }
+}
+
+export default salesUser;

+ 1 - 1
src/utils/request.js

@@ -105,7 +105,7 @@ service.interceptors.response.use(
       return res.data;
     }
     if (code === 222) {
-      let userInfo = JSON.parse(localStorage.getItem("userInfo"));
+      let userInfo = JSON.parse(localStorage.getItem("diworkContext"));
       try {
         const ssoRes = await sso(userInfo);
         if (ssoRes.code === 200) {

+ 28 - 17
src/views/WMS/historical-route/index.vue

@@ -15,29 +15,33 @@
                     carMessage.wmsBillCode
                   }}
                 </el-descriptions-item>
+                <el-descriptions-item label="配送订单编号">{{ item[0].billCode }}</el-descriptions-item>
                 <el-descriptions-item label="收货地址" v-if="bill">{{
                     carMessage.customerAddress
                   }}
                 </el-descriptions-item>
+                <el-descriptions-item label="收货单位" v-if="bill">{{
+                    carMessage.consigneeName
+                  }}
+                </el-descriptions-item>
                 <el-descriptions-item label="联系人" v-if="bill">{{ carMessage.customerContact }}</el-descriptions-item>
-                <el-descriptions-item label="联系电话" v-if="bill">{{ carMessage.customerTel }}</el-descriptions-item>
-                <el-descriptions-item label="配送订单编号">{{ item[0].billCode }}</el-descriptions-item>
-                <el-descriptions-item label="车牌号">{{ item[0].measuringPointName }}</el-descriptions-item>
                 <el-descriptions-item label="开始时间">{{ item[0].hisDate }}</el-descriptions-item>
                 <el-descriptions-item label="结束时间">{{ item[item.length - 1].end }}</el-descriptions-item>
+                <el-descriptions-item label="联系电话" v-if="bill">{{ carMessage.customerTel }}</el-descriptions-item>
+                <el-descriptions-item label="车牌号">{{ item[0].measuringPointName }}</el-descriptions-item>
                 <el-descriptions-item label="探头">{{ item[0].measuringPointAddr }}</el-descriptions-item>
               </el-descriptions>
               <el-table :data="item" stripe border style="width: 97%">
-                <el-table-column prop="temperature" label="温度" align="center" min-width="60"/>
                 <el-table-column prop="hisDate" label="时间点" align="center" min-width="160"/>
-                <el-table-column prop="temperature1" label="温度" align="center" min-width="60"/>
+                <el-table-column prop="temperature" label="温度" align="center" min-width="60"/>
                 <el-table-column prop="hisDate1" label="时间点" align="center" min-width="160"/>
-                <el-table-column prop="temperature2" label="温度" align="center" min-width="60"/>
+                <el-table-column prop="temperature1" label="温度" align="center" min-width="60"/>
                 <el-table-column prop="hisDate2" label="时间点" align="center" min-width="160"/>
-                <el-table-column prop="temperature3" label="温度" align="center" min-width="60"/>
+                <el-table-column prop="temperature2" label="温度" align="center" min-width="60"/>
                 <el-table-column prop="hisDate3" label="时间点" align="center" min-width="160"/>
-                <el-table-column prop="temperature4" label="温度" align="center" min-width="60"/>
+                <el-table-column prop="temperature3" label="温度" align="center" min-width="60"/>
                 <el-table-column prop="hisDate4" label="时间点" align="center" min-width="160"/>
+                <el-table-column prop="temperature4" label="温度" align="center" min-width="60"/>
               </el-table>
               <br>
               <br>
@@ -49,29 +53,33 @@
                     carMessage.wmsBillCode
                   }}
                 </el-descriptions-item>
+                <el-descriptions-item label="配送订单编号">{{ item[0].billCode }}</el-descriptions-item>
                 <el-descriptions-item label="收货地址" v-if="bill">{{
                     carMessage.customerAddress
                   }}
                 </el-descriptions-item>
+                <el-descriptions-item label="收货单位" v-if="bill">{{
+                    carMessage.consigneeName
+                  }}
+                </el-descriptions-item>
                 <el-descriptions-item label="联系人" v-if="bill">{{ carMessage.customerContact }}</el-descriptions-item>
-                <el-descriptions-item label="联系电话" v-if="bill">{{ carMessage.customerTel }}</el-descriptions-item>
-                <el-descriptions-item label="配送订单编号">{{ item[0].billCode }}</el-descriptions-item>
-                <el-descriptions-item label="保温箱号">{{ item[0].measuringPointName }}</el-descriptions-item>
                 <el-descriptions-item label="开始时间">{{ item[0].hisDate }}</el-descriptions-item>
                 <el-descriptions-item label="结束时间">{{ item[item.length - 1].end }}</el-descriptions-item>
+                <el-descriptions-item label="联系电话" v-if="bill">{{ carMessage.customerTel }}</el-descriptions-item>
+                <el-descriptions-item label="保温箱号">{{ item[0].measuringPointName }}</el-descriptions-item>
                 <el-descriptions-item label="探头">{{ item[0].measuringPointAddr }}</el-descriptions-item>
               </el-descriptions>
               <el-table :data="item" stripe border style="width: 97%">
-                <el-table-column prop="temperature" label="温度" align="center" min-width="60"/>
                 <el-table-column prop="hisDate" label="时间点" align="center" min-width="160"/>
-                <el-table-column prop="temperature1" label="温度" align="center" min-width="60"/>
+                <el-table-column prop="temperature" label="温度" align="center" min-width="60"/>
                 <el-table-column prop="hisDate1" label="时间点" align="center" min-width="160"/>
-                <el-table-column prop="temperature2" label="温度" align="center" min-width="60"/>
+                <el-table-column prop="temperature1" label="温度" align="center" min-width="60"/>
                 <el-table-column prop="hisDate2" label="时间点" align="center" min-width="160"/>
-                <el-table-column prop="temperature3" label="温度" align="center" min-width="60"/>
+                <el-table-column prop="temperature2" label="温度" align="center" min-width="60"/>
                 <el-table-column prop="hisDate3" label="时间点" align="center" min-width="160"/>
-                <el-table-column prop="temperature4" label="温度" align="center" min-width="60"/>
+                <el-table-column prop="temperature3" label="温度" align="center" min-width="60"/>
                 <el-table-column prop="hisDate4" label="时间点" align="center" min-width="160"/>
+                <el-table-column prop="temperature4" label="温度" align="center" min-width="60"/>
               </el-table>
               <br>
               <br>
@@ -146,7 +154,8 @@ export default {
         customerName: '',
         customerAddress: '',
         customerContact: '',
-        customerTel: ''
+        customerTel: '',
+        consigneeName: ''
       },
       //标签页
       activeName: 'first',
@@ -201,6 +210,8 @@ export default {
           customerContact:
             '',
           customerTel:
+            '',
+          consigneeName:
             ''
         }
       ,

+ 34 - 0
src/views/business/as/after-sales/components/format-value/index.vue

@@ -0,0 +1,34 @@
+<script>
+export default {
+  name: "FormatValue",
+  props: {
+    value: {
+      type: [String, Number],
+      require: true,
+    },
+    dicts: {
+      type: Array,
+      require: true,
+    },
+  },
+  data() {
+    return {};
+  },
+  computed: {
+    innerValue: {
+      get() {
+        const { value, dicts } = this.$props;
+        const item = dicts.find((dict) => dict.value === value);
+        return item ? item.label : "";
+      },
+      set() {},
+    },
+  },
+  methods: {},
+  created() {},
+};
+</script>
+
+<template>
+  <span>{{ innerValue }}</span>
+</template>

+ 51 - 0
src/views/business/as/after-sales/components/image-preview/index.vue

@@ -0,0 +1,51 @@
+<!-- 文件预览 -->
+<script>
+export default {
+  name: "ImagePreview",
+  props: {
+    value: [Array],
+  },
+  data() {
+    return {
+      // fileList: [],
+    };
+  },
+  computed: {
+    fileList: {
+      get() {
+        return this.$props.value.map((item) => {
+          return {
+            ...item,
+            url: item.filepath,
+          };
+        });
+      },
+      set() {},
+    },
+  },
+  methods: {
+    afterRead(file) {
+      console.log(file, "file");
+    },
+    useDelete() {},
+  },
+  created() {},
+};
+</script>
+
+<template>
+  <div class="preview-image">
+    <van-uploader
+      v-model="fileList"
+      preview-size="60px"
+      :deletable="false"
+      readonly
+    />
+  </div>
+</template>
+
+<style scoped>
+.van-image-preview {
+  z-index: 2024;
+}
+</style>

+ 58 - 2
src/views/business/as/after-sales/components/image-upload/index.vue

@@ -4,17 +4,69 @@ export default {
   name: "ImageUpload",
   props: {
     value: [String, Object, Array],
+    maxCount: {
+      type: [Number, String],
+      default: 9,
+    },
+    fileType: {
+      type: Array,
+      default: () => ["jpg", "jpeg", "png"],
+    },
+    // fileSize: {
+    //   type: Number,
+    // },
   },
   data() {
     return {
       fileList: [],
     };
   },
+  computed: {
+    accept: {
+      get() {
+        const { fileType } = this.$props;
+        const typeList = fileType.reduce((str, item) => {
+          return (str += "." + item + ",");
+        }, "");
+        return typeList;
+      },
+      set() {},
+    },
+  },
   methods: {
     afterRead(file) {
-      console.log(file, "file");
+      let {
+        fileList,
+        $props: { maxCount },
+      } = this;
+      this.$emit("input", fileList);
+
+      if (fileList.length === maxCount) {
+        this.$toast(`最多可上传${maxCount}个文件`);
+      }
+    },
+    useDelete(file) {
+      this.$emit("input", this.fileList);
+    },
+    beforeRead(file, detail) {
+      const fileTypeList = file.type.split("/");
+      const fileExt = fileTypeList[fileTypeList.length - 1];
+      const isTypeOk = this.fileType.indexOf(fileExt) >= 0;
+      console.log(isTypeOk, "isTypeOk");
+      if (!isTypeOk) {
+        this.$toast(
+          `文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`
+        );
+        return false;
+      }
+      return true;
+      // const { fileSize, accept } = this.$props;
+      // const imgformat = /image\/(png|jpg|jpeg)$/;
+      // if (!imgformat.test(file.type)) {
+      //   this.$toast.fail(`请上传 ${accept} 格式图片`);
+      //   return false;
+      // }
     },
-    useDelete() {},
   },
   created() {},
 };
@@ -25,7 +77,11 @@ export default {
     <van-uploader
       v-model="fileList"
       multiple
+      preview-size="60px"
+      :accept="accept"
+      :max-count="maxCount"
       :after-read="afterRead"
+      :before-read="beforeRead"
       @delete="useDelete"
     />
   </div>

+ 27 - 5
src/views/business/as/after-sales/contact-us/index.vue

@@ -1,9 +1,12 @@
 <!-- 联系我们 -->
 <script>
+import Cookies from "js-cookie";
+// import { ProjectInfo } from "@/api/business/as/after-sales";
 export default {
   name: "contactUs",
   data() {
     return {
+      phone: "",
       show: false,
       actions: [
         { name: "拨号", key: "call" },
@@ -12,19 +15,35 @@ export default {
     };
   },
   methods: {
-    onSelect({ key, name }) {
+    async onSelect({ key, name }) {
       this.show = false;
       if (key === "call") {
-        // window.location.href = "tel:18973094426";
+        window.location.href = `tel:${this.phone}`;
         return;
       }
       if (key === "copy") {
-        return;
+        let clipboard = navigator.clipboard || {
+          writeText: (text) => {
+            let copyInput = document.createElement("input");
+            copyInput.value = text;
+            document.body.appendChild(copyInput);
+            copyInput.select();
+            document.execCommand("copy");
+            document.body.removeChild(copyInput);
+          },
+        };
+        if (clipboard) {
+          await clipboard.writeText(this.phone);
+          return this.$toast("已复制到剪贴板");
+        }
       }
     },
     onCancel() {},
   },
-  created() {},
+  created() {
+    // const projectId = Cookies.get("salesProId");
+    // this.getProjectInfo(projectId);
+  },
 };
 </script>
 
@@ -32,7 +51,7 @@ export default {
   <div>
     <van-cell
       is-link
-      title="热线电话40080000"
+      :title="'热线电话' + phone"
       value="8:00-22:00"
       @click="show = true"
     />
@@ -50,5 +69,8 @@ export default {
 <style scope lang="scss">
 .van-cell {
   background-color: #f5f5f5;
+  .van-cell__title {
+    flex-grow: 2;
+  }
 }
 </style>

+ 27 - 5
src/views/business/as/after-sales/feedback/columns.js

@@ -1,35 +1,57 @@
 export default function useColumns() {
   const userColumns = [
     {
-      item: { key: "questioner", title: "用户姓名", },
+      item: { key: "projectSource", title: "项目名称", required: true, },
       attr: {
         is: "el-input",
+        readonly: true,
       }
     },
     {
-      item: { key: "roomInformation", title: "用户科室", },
+      item: {
+        key: "questioner",
+        title: "用户姓名",
+        required: true,
+      },
       attr: {
         is: "el-input",
       }
     },
     {
-      item: { key: "questionerWay", title: "联系方式", },
+      item: { key: "roomInformation", title: "用户科室", required: true, },
       attr: {
         is: "el-input",
       }
     },
+    {
+      item: { key: "questionerWay", title: "联系方式", required: true, },
+      attr: {
+        is: "el-input",
+        rules: [{
+          pattern: /^1[3-9]\d{9}$/,
+          message: "手机号格式错误",
+          trigger: "blur",
+        },]
+      }
+    },
 
   ];
 
   const problemColumns = [
     {
-      item: { key: "problemType", title: "问题类型", },
+      item: { key: "problemType", title: "问题类型", required: true, },
       attr: {
         is: "el-select",
+        options: [
+          { label: "软件问题", value: "1" },
+          { label: "硬件问题", value: "2" },
+          { label: "服务问题", value: "3" },
+          { label: "其他问题", value: "4" },
+        ],
       }
     },
     {
-      item: { key: "problemDescription", title: "问题描述", },
+      item: { key: "problemDescription", title: "问题描述", required: true, },
       attr: {
         is: "el-input",
         rows: 5,

+ 99 - 17
src/views/business/as/after-sales/feedback/index.vue

@@ -1,6 +1,8 @@
 <!-- 问题反馈 -->
 <script>
+import Cookies from "js-cookie";
 import useColumns from "./columns";
+import { AddProblem, GetUser } from "@/api/business/as/after-sales";
 export default {
   name: "Feedback",
   components: {
@@ -9,28 +11,83 @@ export default {
   data() {
     const { userColumns, problemColumns } = useColumns();
 
-    const problemInfo = this.$init.params([...userColumns, ...problemColumns]);
+    const params = this.$init.params([...userColumns, ...problemColumns]);
+    const rules = this.$init.rules([...userColumns, ...problemColumns]);
     return {
       params: {
-        problemInfo: {
-          ...problemInfo,
-          projectSource: "测试项目",
-        },
-        files: [],
+        ...params,
+        userId: Cookies.get("salesId"),
+        hospitalId: null,
+        // projectSource: "测试项目",
       },
+      files: [],
       userColumns,
       size: "mini",
       loading: false,
       problemColumns,
       title: "问题反馈",
+      rules,
     };
   },
   methods: {
     useBack() {
       this.$router.go(-1);
     },
+    useSubmit(prop) {
+      this.$refs[prop].validate(async (valid) => {
+        if (valid) {
+          try {
+            console.log({ params: this.params, files: this.files }, "params");
+            this.loading = true;
+            let formData = new FormData();
+            this.files.forEach((f) => {
+              formData.append("files", f.file);
+            });
+            const blob = new Blob([JSON.stringify(this.params)], {
+              type: "application/json",
+            });
+            // formData.append("problemInfo", blob);
+            let { code, msg } = await AddProblem(formData, this.params);
+            if (code === 200) {
+              this.$toast(msg);
+              this.useBack();
+            }
+          } catch (error) {
+          } finally {
+            this.loading = false;
+          }
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+    async fetchUser() {
+      try {
+        // const { id } = this.$store.state.salesUser;
+        this.loading = true;
+        // const id = Cookies.get("salesId");
+        const { userId } = this.params;
+        let { code, data } = await GetUser({ id: userId });
+        if (code === 200) {
+          this.params = {
+            userId: data.id,
+            hospitalId: data.hospitalId,
+            projectSource: data.userProject,
+            questioner: data.userName,
+            roomInformation: data.userRoom,
+            questionerWay: data.userPhone,
+          };
+        }
+      } catch (error) {
+      } finally {
+        this.loading = false;
+      }
+    },
+  },
+  created() {
+    this.fetchUser();
   },
-  created() {},
 };
 </script>
 
@@ -48,24 +105,26 @@ export default {
 
     <div style="width: 100%; padding: 16px">
       <el-form
-        ref="userInfo"
-        :model="params.problemInfo"
+        ref="problemInfo"
+        :model="params"
         label-width="auto"
         :size="size"
+        :rules="rules"
       >
         <!-- 基本信息 -->
         <el-row>
-          <el-form-item label="项目名称">
-            <span>{{ params.problemInfo.projectSource }}</span>
-          </el-form-item>
+          <!-- <el-form-item label="项目名称">
+            <span>{{ params.projectSource }}</span>
+          </el-form-item> -->
           <el-form-item
             v-for="({ item, attr }, index) in userColumns"
             :label="item.title"
+            :prop="item.key"
           >
             <component
               :is="attr.is"
               v-bind="attr"
-              v-model="params.problemInfo[item.key]"
+              v-model="params[item.key]"
             ></component>
           </el-form-item>
         </el-row>
@@ -75,22 +134,44 @@ export default {
           <el-form-item
             v-for="({ item, attr }, index) in problemColumns"
             :label="item.title"
+            :prop="item.key"
           >
             <component
+              v-if="attr.is === 'el-select'"
+              :is="attr.is"
+              v-bind="attr"
+              v-model="params[item.key]"
+              style="width: 100%"
+            >
+              <el-option
+                v-for="op in attr.options"
+                :key="op.value"
+                :label="op.label"
+                :value="op.value"
+              >
+              </el-option>
+            </component>
+            <component
+              v-else
               :is="attr.is"
               v-bind="attr"
-              v-model="params.problemInfo[item.key]"
+              v-model="params[item.key]"
               style="width: 100%"
             ></component>
           </el-form-item>
-          <el-form-item label="问题图片">
-            <image-upload v-model="params.files" :size="size"></image-upload>
+          <el-form-item label="问题图片" prop="files">
+            <image-upload v-model="files" :size="size"></image-upload>
           </el-form-item>
         </el-row>
       </el-form>
     </div>
 
-    <el-button type="primary" round class="stickyBtn" :size="size"
+    <el-button
+      type="primary"
+      round
+      class="stickyBtn"
+      :size="size"
+      @click="useSubmit('problemInfo')"
       >提 交</el-button
     >
   </div>
@@ -113,6 +194,7 @@ export default {
   padding: 16px;
   box-sizing: border-box;
   background-color: #fff;
+  border-radius: 4px;
   margin-bottom: 12px;
 }
 .stickyBtn {

+ 47 - 1
src/views/business/as/after-sales/index.vue

@@ -1,7 +1,9 @@
 <!-- SPD售后问题收集 -->
 <!-- 首页 -->
 <script>
+import Cookies from "js-cookie";
 import Columns from "./columns";
+import { AddUser, ProjectInfo } from "@/api/business/as/after-sales";
 export default {
   name: "afterSales",
   components: {
@@ -18,9 +20,53 @@ export default {
   },
   methods: {
     useBack() {},
+    // 用户信息获取——二维码进入
+    async fetchUser(prop) {
+      try {
+        this.loading = true;
+        let params = {
+          ...prop,
+          userSource: "2",
+        };
+        console.log(params, "params");
+        let { code, data } = await AddUser({ ...params });
+        if (code === 200) {
+          await this.getProjectInfo(data.hospitalId);
+          this.$store.dispatch("setSalesUser", { data }).then(async () => {
+            this.$toast("登录成功");
+          });
+        }
+      } catch (error) {
+      } finally {
+        this.loading = false;
+      }
+    },
+    async getProjectInfo(id) {
+      try {
+        this.loading = true;
+        let { code, data } = await ProjectInfo({ id });
+        if (code === 200) {
+          this.phone = data.defaultContactWay;
+        }
+      } catch (error) {
+      } finally {
+        this.loading = false;
+      }
+    },
   },
 
-  created() {},
+  created() {
+    // phonenumber 手机号 hosName 项目名称 officeName 科室名称
+    const { phonenumber, hosName, officeName } = this.$route.query;
+    if (phonenumber && hosName && officeName) {
+      // 二维码进入
+      this.fetchUser({
+        userRoom: officeName,
+        userProject: hosName,
+        userPhone: phonenumber,
+      });
+    }
+  },
 };
 </script>
 

+ 36 - 0
src/views/business/as/after-sales/progress/columns.js

@@ -0,0 +1,36 @@
+export default function useColumns() {
+
+  const formColumns = [
+    {
+      item: { key: "projectSource", title: "项目名称" },
+      attr: {}
+    },
+    {
+      item: { key: "problemType", title: "问题类型" },
+      attr: {
+        is: "el-select",
+        options: [
+          { label: "软件问题", value: "1" },
+          { label: "硬件问题", value: "2" },
+          { label: "服务问题", value: "3" },
+          { label: "其他问题", value: "4" },
+        ],
+      }
+    },
+    {
+      item: { key: "problemDescription", title: "问题描述" },
+      attr: {}
+    },
+    {
+      item: { key: "problemPicture", title: "问题图片" },
+      attr: {
+        is: "el-image-preview",
+      }
+    },
+  ];
+
+  return {
+    formColumns
+  }
+
+}

+ 300 - 3
src/views/business/as/after-sales/progress/details.vue

@@ -1,15 +1,312 @@
 <!-- 进度查询-详情 -->
 <script>
+import useColumns from "./columns";
+import { ProblemItem } from "@/api/business/as/after-sales";
 export default {
   name: "asDetails",
+  props: {
+    value: {
+      type: [String, Number],
+      require: true,
+    },
+  },
+  components: {
+    ElFormatValue: () => import("../components/format-value/index.vue"),
+    ElImagePreview: () => import("../components/image-preview/index.vue"),
+  },
   data() {
-    return {};
+    const { formColumns } = useColumns();
+    const params = this.$init.params(formColumns);
+    return {
+      title: "进度详情",
+      width: "100%",
+      loading: false,
+      visible: false,
+      size: "medium",
+      formColumns,
+      params: {
+        ...params,
+        problemPicture: [],
+      },
+      imgUrl: require("../images/order.png"),
+      phone: "",
+      show: false,
+      actions: [
+        { name: "拨号", key: "call" },
+        { name: "复制", key: "copy" },
+      ],
+    };
+  },
+  computed: {
+    problemId: {
+      get() {
+        return this.$props.value;
+      },
+      set() {},
+    },
+    isFinished: {
+      get() {
+        if (this.params.processFlow) {
+          const finished = this.params.processFlow.findIndex(
+            (item) => item.problemStateSolve == "0"
+          );
+          return finished !== -1;
+        }
+        return false;
+      },
+      set() {},
+    },
+  },
+  methods: {
+    setVisible(prop) {
+      this.visible = prop;
+    },
+    hide() {
+      this.params = {
+        ...this.$init.params(this.formColumns),
+        problemPicture: [],
+      };
+      this.visible = false;
+      this.$emit("refresh");
+    },
+    beforeOpen() {
+      this.fetchItem(this.problemId);
+    },
+    async fetchItem(id) {
+      try {
+        this.loading = true;
+
+        let { code, data } = await ProblemItem({ id });
+        if (code === 200) {
+          this.params = data;
+        }
+      } catch (error) {
+      } finally {
+        this.loading = false;
+      }
+    },
+    useCall(prop) {
+      this.phone = prop.processorWay;
+      this.show = true;
+    },
+    async onSelect({ key, name }) {
+      this.show = false;
+      if (key === "call") {
+        window.location.href = `tel:${this.phone}`;
+        return;
+      }
+      if (key === "copy") {
+        let clipboard = navigator.clipboard || {
+          writeText: (text) => {
+            let copyInput = document.createElement("input");
+            copyInput.value = text;
+            document.body.appendChild(copyInput);
+            copyInput.select();
+            document.execCommand("copy");
+            document.body.removeChild(copyInput);
+          },
+        };
+        if (clipboard) {
+          await clipboard.writeText(this.phone);
+          return this.$toast("已复制到剪贴板");
+        }
+      }
+    },
+    onCancel() {},
+    // 处理状态
+    handleStatus(convert, solve) {
+      // problemStateConvert 是否转工单 0 转工单  1 未转工单
+      // problemStateSolve   是否解决   0 已解决  1 未解决
+      if (convert == "0") {
+        return solve == "0" ? "转工单-已解决" : "转工单-待解决";
+      } else {
+        return solve == "0" ? "已解决" : "待解决";
+      }
+    },
   },
-  methods: {},
   created() {},
 };
 </script>
 
 <template>
-  <div>进度查询-详情</div>
+  <el-drawer
+    :size="width"
+    v-bind="$attrs"
+    v-on="$listeners"
+    v-loading="loading"
+    :visible.sync="visible"
+    :show-close="false"
+    destroy-on-close
+    @close="hide"
+    @open="beforeOpen"
+  >
+    <div
+      slot="title"
+      style="display: flex; justify-content: space-between; align-items: center"
+    >
+      <van-nav-bar
+        :title="title"
+        left-text="返回"
+        left-arrow
+        @click-left="hide"
+        style="width: 100%"
+      />
+    </div>
+
+    <el-form :model="params">
+      <el-descriptions :column="1" :size="size" :reverse="true">
+        <template slot="title">
+          <div class="mes_title">
+            <div style="display: flex; align-items: center">
+              <el-image
+                style="width: 16px; height: 16px; margin-right: 10px"
+                :src="imgUrl"
+                fit="contain"
+              ></el-image>
+              <span>单号:{{ params.problemCode }}</span>
+            </div>
+            <span>{{
+              params.createTime &&
+              new Date(params.createTime.replace(/-/g, "/")).Format(
+                "yyyy-MM-dd HH:mm"
+              )
+            }}</span>
+          </div>
+        </template>
+
+        <el-descriptions-item
+          v-for="({ item, attr }, index) in formColumns"
+          :label="item.title"
+        >
+          <el-format-value
+            v-if="attr.is === 'el-select'"
+            v-model="params[item.key]"
+            :dicts="attr.options"
+          ></el-format-value>
+          <el-image-preview
+            v-else-if="attr.is === 'el-image-preview'"
+            v-model="params[item.key]"
+          ></el-image-preview>
+          <span v-else>{{ params[item.key] }}</span>
+        </el-descriptions-item>
+      </el-descriptions>
+
+      <el-card shadow="never">
+        <p class="dispose">
+          <span>工单处理状态</span>
+          <span style="color: #ff8500; font-size: 12px"
+            >持续时长:{{ params.processingTime }}</span
+          >
+        </p>
+        <el-timeline style="padding: 16px 12px">
+          <el-timeline-item
+            v-for="(flow, index) in params.processFlow"
+            :key="index"
+            :timestamp="flow.timestamp"
+            :type="flow.problemStateSolve == '0' ? 'success' : 'primary'"
+            size="large"
+          >
+            <div>
+              <span
+                >[{{
+                  handleStatus(
+                    flow.problemStateConvert,
+                    flow.problemStateSolve
+                  )
+                }}] {{ flow.content }}</span
+              >
+              <div style="padding: 6px 0 0">
+                <span>处理人:{{ flow.processorName }}</span>
+                <el-button
+                  v-if="flow.processorWay"
+                  type="text"
+                  @click="useCall(flow)"
+                  style="padding: 0px 12px"
+                  >{{ flow.processorWay }}</el-button
+                >
+              </div>
+              <template v-if="flow.problemStateSolve == '0'">
+                <div style="padding-top: 6px">
+                  处理反馈:{{ params.processingFeedback }}
+                </div>
+
+                <div style="display: flex; padding-top: 6px">
+                  <span style="flex-shrink: 0"> 处理图片:</span>
+                  <el-image-preview
+                    v-model="params.processorPicture"
+                  ></el-image-preview>
+                </div>
+              </template>
+            </div>
+          </el-timeline-item>
+          <el-timeline-item
+            v-if="!isFinished"
+            color="#ff8500"
+            size="large"
+          ></el-timeline-item>
+        </el-timeline>
+      </el-card>
+      <van-action-sheet
+        v-model="show"
+        :actions="actions"
+        cancel-text="取消"
+        close-on-click-action
+        @cancel="onCancel"
+        @select="onSelect"
+      />
+    </el-form>
+  </el-drawer>
 </template>
+
+<style scoped lang="scss">
+::v-deep .el-drawer__header {
+  padding: 0 !important;
+  margin: 0 !important;
+}
+.el-form {
+  height: 100%;
+  padding: 16px;
+  background-color: #f7f7f7;
+}
+
+.el-descriptions {
+  padding: 12px;
+  background-color: #fff;
+  border-radius: 4px;
+}
+::v-deep .el-descriptions__header {
+  margin: 0 0 12px;
+  color: #303133;
+}
+::v-deep .el-descriptions__title {
+  width: 100%;
+}
+.mes_title {
+  width: 100%;
+  font-size: 14px;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+::v-deep .van-uploader__upload {
+  display: none;
+}
+
+.el-card {
+  margin: 10px 0;
+  font-size: 14px;
+}
+::v-deep .el-card__body {
+  padding: 0;
+}
+.dispose {
+  border-bottom: 1px solid #e2dede;
+  margin: 0;
+  line-height: 28px;
+  padding: 6px 12px;
+  font-weight: 600;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+</style>

+ 129 - 12
src/views/business/as/after-sales/progress/index.vue

@@ -1,19 +1,59 @@
 <!-- 进度查询-列表 -->
 <script>
+import Cookies from "js-cookie";
+import { ProblemList } from "@/api/business/as/after-sales";
 export default {
   name: "Progress",
+  components: {
+    ProgressDetail: () => import("./details.vue"),
+  },
   data() {
     return {
+      size: "mini",
       loading: false,
       title: "进度查询",
+      imgUrl: require("../images/order.png"),
+      dataList: [],
+      checkedId: null,
     };
   },
   methods: {
     useBack() {
       this.$router.go(-1);
     },
+    handleDetail(prop) {
+      this.checkedId = prop.id;
+      let { setVisible } = this.$refs.ProgressDetail;
+      setVisible(true);
+    },
+    async getList() {
+      try {
+        this.loading = true;
+        // const { id } = this.$store.state.salesUser;
+        const userId = Cookies.get("salesId");
+        let { code, rows } = await ProblemList({ userId });
+        if (code === 200) {
+          this.dataList = rows;
+        }
+      } catch (error) {
+      } finally {
+        this.loading = false;
+      }
+    },
+    // 处理状态
+    handleStatus(convert, solve) {
+      // problemStateConvert 是否转工单 0 转工单  1 未转工单
+      // problemStateSolve   是否解决   0 已解决  1 未解决
+      if (convert == "0") {
+        return solve == "0" ? "转工单-已解决" : "转工单-待解决";
+      } else {
+        return solve == "0" ? "已解决" : "待解决";
+      }
+    },
+  },
+  created() {
+    this.getList();
   },
-  created() {},
 };
 </script>
 
@@ -29,17 +69,79 @@ export default {
       'align-items': 'center',
     }"
   >
-    <van-nav-bar
-      :title="title"
-      left-text="返回"
-      left-arrow
-      @click-left="useBack"
-      style="width: 100%"
-    />
+    <van-sticky style="width: 100%">
+      <van-nav-bar
+        :title="title"
+        left-text="返回"
+        left-arrow
+        @click-left="useBack"
+        style="width: 100%"
+      />
+    </van-sticky>
+    <el-row v-if="dataList.length">
+      <el-col
+        v-for="data in dataList"
+        :span="24"
+        @click.native="handleDetail(data)"
+      >
+        <div class="mes_title">
+          <div style="display: flex; align-items: center">
+            <el-image
+              style="width: 16px; height: 16px; margin-right: 12px"
+              :src="imgUrl"
+              fit="contain"
+            ></el-image>
+            <span>{{ data.problemCode }}</span>
+          </div>
+          <span>{{
+            new Date(data.createTime.replace(/-/g, "/")).Format(
+              "yyyy-MM-dd HH:mm"
+            )
+          }}</span>
+        </div>
+        <p
+          class="van-ellipsis"
+          style="color: #333; font-size: 14px; margin: 5px 0px"
+        >
+          <el-tag
+            :size="size"
+            style="margin-right: 8px"
+            :type="
+              data.processFlow[0].problemStateSolve == '0'
+                ? 'success'
+                : 'danger'
+            "
+            >{{
+              handleStatus(
+                data.processFlow[0].problemStateConvert,
+                data.processFlow[0].problemStateSolve
+              )
+            }}</el-tag
+          >
 
-    <el-row>
-      <el-col :span="24"> </el-col>
+          <span>{{ data.processFlow[0].content }}</span>
+        </p>
+        <p class="van-ellipsis" style="margin: 0">
+          问题描述:{{ data.problemDescription }}
+        </p>
+      </el-col>
     </el-row>
+
+    <el-empty
+      v-else
+      :image-size="100"
+      style="
+        position: absolute;
+        top: 50%;
+        left: 50%;
+        transform: translate(-50%, -50%);
+      "
+    ></el-empty>
+    <progress-detail
+      ref="ProgressDetail"
+      v-model="checkedId"
+      @refresh="getList"
+    ></progress-detail>
   </el-card>
 </template>
 
@@ -47,16 +149,31 @@ export default {
 .el-card {
   width: 100%;
   height: 100vh;
-  overflow-y: auto;
-  overflow-x: hidden;
+  overflow: hidden;
   background-color: #f7f7f7;
 }
 .el-row {
   width: 100%;
+  height: calc(100vh - 46px);
+  overflow-x: hidden;
+  overflow-y: auto;
   padding: 16px;
   box-sizing: border-box;
+  border-radius: 4px;
   .el-col {
     margin-bottom: 16px;
+    background-color: #fff;
+    padding: 12px;
+    font-size: 12px;
+    color: #9b9b9b;
+    .mes_title {
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+    }
+    span {
+      align-self: center;
+    }
   }
 }
 </style>

+ 40 - 17
src/views/business/as/after-sales/user/bindingInfo.vue

@@ -1,5 +1,6 @@
 <!-- 绑定用户信息 -->
 <script>
+import { AddUser } from "@/api/business/as/after-sales";
 export default {
   name: "BindingInfo",
   props: {
@@ -12,15 +13,17 @@ export default {
       width: "100%",
       loading: false,
       visible: false,
-      formData: {
-        name: "cs",
-        departments: "cs",
+      params: {
+        userName: null,
+        userRoom: null,
+        userPhone: null,
+        userProject: null,
       },
       rules: {
-        name: [{ required: true, message: "请输入科室名称", trigger: "blur" }],
-        departments: [
-          { required: true, message: "请输入姓名", trigger: "blur" },
+        userName: [
+          { required: true, message: "请输入科室名称", trigger: "blur" },
         ],
+        userRoom: [{ required: true, message: "请输入姓名", trigger: "blur" }],
       },
     };
   },
@@ -28,16 +31,33 @@ export default {
     setVisible(prop) {
       this.visible = prop;
     },
-    beforeOpen() {},
-    useConfirm() {},
+    beforeOpen() {
+      // const { userProject, userPhone, hid } = this.$props.value;
+      this.params = {
+        ...this.params,
+        ...this.$props.value,
+        // hid,
+        // userPhone,
+        // userProject,
+      };
+    },
     useSubmit(prop) {
       this.$refs[prop].validate(async (valid) => {
         if (valid) {
           try {
-            console.log(this.formData, "formData");
-            console.log(this.$props.value, "value");
-            this.$router.push({ name: "afterSales" });
-          } catch (error) {}
+            this.loading = true;
+            console.log(this.params, "params");
+            let { code, data } = await AddUser({ ...this.params });
+            if (code === 200) {
+              this.$store.dispatch("setSalesUser", { data }).then(async () => {
+                this.$toast("登录成功");
+                await this.$router.push({ name: "afterSales" });
+              });
+            }
+          } catch (error) {
+          } finally {
+            this.loading = false;
+          }
         } else {
           console.log("error submit!!");
           return false;
@@ -46,6 +66,9 @@ export default {
     },
     hide() {
       this.visible = false;
+      for (const key in this.params) {
+        this.params[key] = null;
+      }
     },
   },
   created() {},
@@ -78,7 +101,7 @@ export default {
       />
     </div>
     <el-form
-      :model="formData"
+      :model="params"
       :size="$attrs.size"
       :rules="rules"
       ref="form"
@@ -87,14 +110,14 @@ export default {
     >
       <h3 style="font-weight: 600">请输入您的信息</h3>
       <p style="color: #c0c4cc; font-size: 14px">方便我们联系到您</p>
-      <el-form-item label="您的科室" prop="departments">
+      <el-form-item label="您的科室" prop="userRoom">
         <el-input
-          v-model="formData.departments"
+          v-model="params.userRoom"
           placeholder="请输入科室名称"
         ></el-input>
       </el-form-item>
-      <el-form-item label="您的姓名" prop="name">
-        <el-input v-model="formData.name" placeholder="请输入姓名"></el-input>
+      <el-form-item label="您的姓名" prop="userName">
+        <el-input v-model="params.userName" placeholder="请输入姓名"></el-input>
       </el-form-item>
       <!-- <el-form-item>
         <el-button

+ 8 - 3
src/views/business/as/after-sales/user/columns.js

@@ -1,21 +1,26 @@
 export default function useColumns() {
   const Columns = [
     {
-      item: { key: "userName", title: "您的姓名", },
+      item: { key: "userName", title: "您的姓名", required: true, },
       attr: {
         is: "el-input",
       }
     },
     {
-      item: { key: "userRoom", title: "您的科室", },
+      item: { key: "userRoom", title: "您的科室", required: true, },
       attr: {
         is: "el-input",
       }
     },
     {
-      item: { key: "userPhone", title: "登录手机", },
+      item: { key: "userPhone", title: "登录手机", required: true, },
       attr: {
         is: "el-input",
+        rules: [{
+          pattern: /^1[3-9]\d{9}$/,
+          message: "手机号格式错误",
+          trigger: "blur",
+        },]
       }
     },
   ]

+ 52 - 4
src/views/business/as/after-sales/user/index.vue

@@ -1,25 +1,61 @@
 <!-- 用户信息 -->
 <script>
+import Cookies from "js-cookie";
 import useColumns from "./columns";
+import { GetUser, EditUser } from "@/api/business/as/after-sales";
 export default {
   name: "asUser",
   data() {
     const { Columns } = useColumns();
     const params = this.$init.params(Columns);
+    const rules = this.$init.rules(Columns);
     return {
       Columns,
       size: "mini",
       loading: false,
-      title: "进度查询",
+      title: "用户信息",
       params,
+      rules,
     };
   },
   methods: {
     useBack() {
       this.$router.go(-1);
     },
+    async fetchUser() {
+      try {
+        // const { id } = this.$store.state.salesUser;
+        const id = Cookies.get("salesId");
+        let { code, data } = await GetUser({ id });
+        if (code === 200) {
+          this.params = data;
+        }
+      } catch (error) {}
+    },
+    useSubmit(prop) {
+      this.$refs[prop].validate(async (valid) => {
+        if (valid) {
+          try {
+            console.log(this.params, "params");
+            this.loading = true;
+            let { code, msg } = await EditUser({ ...this.params });
+            if (code === 200) {
+              this.$toast(msg);
+            }
+          } catch (error) {
+          } finally {
+            this.loading = false;
+          }
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+  },
+  created() {
+    this.fetchUser();
   },
-  created() {},
 };
 </script>
 
@@ -44,10 +80,17 @@ export default {
     />
 
     <div style="width: 100%; padding: 16px">
-      <el-form ref="userInfo" :model="params" label-width="auto" :size="size">
+      <el-form
+        ref="userInfo"
+        :model="params"
+        label-width="auto"
+        :size="size"
+        :rules="rules"
+      >
         <el-form-item
           v-for="({ item, attr }, index) in Columns"
           :label="item.title"
+          :prop="item.key"
         >
           <component
             :is="attr.is"
@@ -58,7 +101,12 @@ export default {
       </el-form>
     </div>
 
-    <el-button type="primary" round class="stickyBtn" :size="size"
+    <el-button
+      type="primary"
+      round
+      class="stickyBtn"
+      :size="size"
+      @click="useSubmit('userInfo')"
       >提 交</el-button
     >
   </el-card>

+ 45 - 12
src/views/business/as/after-sales/user/login.vue

@@ -1,5 +1,7 @@
 <!-- 登录 -->
 <script>
+import Cookies from "js-cookie";
+import { FirstLogin, ProjectInfo } from "@/api/business/as/after-sales";
 export default {
   name: "asLogin",
   components: {
@@ -12,12 +14,16 @@ export default {
       fit: "contain",
       imgUrl: require("../images/logo.jpg"),
       formData: {
-        name: "测试项目",
-        phone: "13520547701",
+        hospitalId: null,
+        userProject: null,
+        userPhone: null,
+        // userPhone: "13520547721",
       },
       rules: {
-        name: [{ required: true, message: "请输入项目名称", trigger: "blur" }],
-        phone: [
+        userProject: [
+          { required: true, message: "请输入项目名称", trigger: "blur" },
+        ],
+        userPhone: [
           { required: true, message: "请输入手机号码", trigger: "blur" },
           {
             pattern: /^1[3-9]\d{9}$/,
@@ -35,9 +41,19 @@ export default {
         if (valid) {
           try {
             console.log(this.formData, "formData");
-            let { setVisible } = this.$refs.BindingInfo;
-            setVisible(true);
-            // this.$router.push({ name: "BindingInfo" });
+            let { code, data } = await FirstLogin({ ...this.formData });
+            if (code === 200) {
+              if (data) {
+                this.$store.dispatch("setSalesUser", { data }).then(() => {
+                  this.$toast("登录成功");
+                  this.$router.push({ name: "afterSales" });
+                });
+              } else {
+                // 第一次登录
+                let { setVisible } = this.$refs.BindingInfo;
+                setVisible(true);
+              }
+            }
           } catch (error) {}
         } else {
           console.log("error submit!!");
@@ -45,8 +61,25 @@ export default {
         }
       });
     },
+    async getProjectInfo(id) {
+      try {
+        this.loading = true;
+        let { code, data } = await ProjectInfo({ id });
+        if (code === 200) {
+          Cookies.set("salesProId", data.id);
+          this.formData.userProject = data.projectSource;
+        }
+      } catch (error) {
+      } finally {
+        this.loading = false;
+      }
+    },
+  },
+  created() {
+    const { id } = this.$route.params;
+    this.formData.hospitalId = id;
+    this.getProjectInfo(id);
   },
-  created() {},
 };
 </script>
 
@@ -77,16 +110,16 @@ export default {
       label-position="top"
     >
       <h3 style="font-weight: 600">欢迎登录</h3>
-      <el-form-item label="项目名称" prop="name">
+      <el-form-item label="项目名称" prop="userProject">
         <el-input
-          v-model="formData.name"
+          v-model="formData.userProject"
           placeholder="请输入项目名称"
           readonly
         ></el-input>
       </el-form-item>
-      <el-form-item label="手机号码" prop="phone">
+      <el-form-item label="手机号码" prop="userPhone">
         <el-input
-          v-model="formData.phone"
+          v-model="formData.userPhone"
           placeholder="请输入手机号"
         ></el-input>
       </el-form-item>

+ 19 - 6
src/views/business/as/afterAalesProblemAnalysis/index.vue

@@ -37,6 +37,7 @@
       <el-table
         :data="dataList"
         style="width: 100%;margin-top: 20px"
+        :height="tableHeight"
         :header-cell-style="{'text-align':'center'}"
         :cell-style="{'text-align':'center'}"
         border
@@ -44,7 +45,7 @@
         <el-table-column
           prop="date"
           label="序号"
-          width="100">
+          width="90">
           <template #default="scope">
             {{scope.$index+1}}
           </template>
@@ -57,7 +58,7 @@
         <el-table-column
           prop="address"
           label="总问题(已解决/未解决)"
-          width="240">
+          width="230">
           <template #default="scope">
             <a>{{scope.row.solvedProblem+'/'+scope.row.unsolvedProblem}}</a>
           </template>
@@ -65,7 +66,7 @@
         <el-table-column
           prop="address"
           label="软件问题(已解决/未解决)"
-          width="240">
+          width="230">
           <template #default="scope">
             <a>{{scope.row.typeOneSolvedProblem+'/'+scope.row.typeOneUnsolvedProblem}}</a>
           </template>
@@ -73,7 +74,7 @@
         <el-table-column
           prop="address"
           label="服务问题(已解决/未解决)"
-          width="240">
+          width="230">
           <template #default="scope">
             <a>{{scope.row.typeThreeSolvedProblem+'/'+scope.row.typeThreeUnsolvedProblem}}</a>
           </template>
@@ -81,7 +82,7 @@
         <el-table-column
           prop="address"
           label="硬件问题(已解决/未解决)"
-          width="240">
+          width="230">
           <template #default="scope">
             <a>{{scope.row.typeTwoSolvedProblem+'/'+scope.row.typeTwoUnsolvedProblem}}</a>
           </template>
@@ -89,7 +90,7 @@
         <el-table-column
           prop="address"
           label="其他问题(已解决/未解决)"
-          width="240">
+          width="230">
           <template #default="scope">
             <a>{{scope.row.typeFourSolvedProblem+'/'+scope.row.typeFourUnsolvedProblem}}</a>
           </template>
@@ -115,6 +116,7 @@ import {getHospitalAndProcessor} from "@/api/business/as/problemInfo";
 export default {
   created() {
     this.queryBtn()
+    this.getTableHeight()
     getHospitalAndProcessor().then(res =>{
       if(res.code == 200){
         this.restaurants = res.data
@@ -122,6 +124,16 @@ export default {
     })
   },
   methods:{
+    //计算table高度(动态设置table高度)
+    getTableHeight() {
+      let tableH = 120; //距离页面下方的高度
+      let tableHeightDetil = window.innerHeight - tableH;
+      if (tableHeightDetil <= 300) {
+        this.tableHeight = 300;
+      } else {
+        this.tableHeight = window.innerHeight - tableH;
+      }
+    },
     querySearchAsync(queryString, cb) {
       this.restaurants.forEach((item) =>{
         item.value=item.projectSource
@@ -179,6 +191,7 @@ export default {
   },
   data(){
     return {
+      tableHeight:'',
       total:'',
       dataList:[],
       dateRange:[],

+ 255 - 0
src/views/business/as/afterSalesUser/index.vue

@@ -0,0 +1,255 @@
+<template>
+  <div class="afterSalesUser">
+
+    <el-form ref="queryParams" :model="queryParams" label-width="80px">
+      <el-row :gutter="12">
+        <el-col :span="6">
+          <el-form-item label="用户姓名">
+            <el-input v-model="queryParams.userName" clearable placeholder="请输入用户姓名" ></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="用户项目">
+            <el-select v-model="queryParams.userProject" clearable placeholder="请选择" style="width: 100%;">
+              <el-option
+                v-for="item in userProjectList"
+                :key="item.userProject"
+                :label="item.userProject"
+                :value="item.userProject">
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="用户科室">
+            <el-input v-model="queryParams.userRoom" clearable placeholder="请输入用户科室"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-row >
+            <el-col :span="1" offset="16">
+              <el-button type="primary" @click="getDataList">搜索</el-button>
+            </el-col>
+
+          </el-row>
+
+        </el-col>
+      </el-row>
+      <el-row :gutter="12">
+        <el-col :span="6">
+          <el-form-item label="登录手机">
+            <el-input v-model="queryParams.userPhone" clearable placeholder="请输入登录手机"></el-input>
+          </el-form-item>
+        </el-col>
+
+      </el-row>
+    </el-form>
+    <el-row>
+      <el-table
+        :data="dataList"
+        style="width: 100%"
+        :height="tableHeight"
+        :header-cell-style="{'text-align':'center'}"
+        :cell-style="{'text-align':'center'}"
+        border>
+        <el-table-column
+        prop="序号"
+        label="序号"
+        width="100px">
+          <template slot-scope="scope">
+            {{scope.$index+1}}
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="userName"
+          label="用户姓名"
+          width="300">
+        </el-table-column>
+        <el-table-column
+          prop="userProject"
+          label="用户项目"
+          width="240">
+        </el-table-column>
+        <el-table-column
+          prop="userRoom"
+          label="用户科室"
+          width="240">
+        </el-table-column>
+        <el-table-column
+          prop="userPhone"
+          label="登录手机"
+          width="300">
+        </el-table-column>
+        <el-table-column
+          prop="address"
+          label="操作"
+          width="300">
+          <template #default="scope">
+            <el-button type="text" @click="edit(scope.row)">编辑</el-button>|
+            <el-button type="text" @click="remove(scope.row.id)">删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-pagination
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+        :current-page=this.queryParams.pageNum
+        :page-sizes="[10,20,50,100]"
+        :page-size=this.queryParams.pageSize
+        layout="total, sizes, prev, pager, next, jumper"
+        :total=this.total>
+      </el-pagination>
+    </el-row>
+
+    <el-dialog
+      title="提示"
+      :visible.sync="editDialog"
+      width="80%"
+      :before-close="handleClose">
+      <el-form ref="form" :model="form" label-width="80px">
+        <el-row>
+          <el-col :span="6">
+            <el-form-item label="用户姓名">
+              <el-input v-model="form.userName"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="用户项目">
+              <el-input v-model="form.userProject"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="用户科室">
+              <el-input v-model="form.userRoom"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="登陆手机">
+              <el-input v-model="form.userPhone"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+    <el-button @click="editDialog = false">取 消</el-button>
+    <el-button type="primary" @click="submitForm">确 定</el-button>
+  </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+
+import {deleteById, edit, getList, getUserProjectList} from "@/api/business/as/afterSalesUser";
+
+export default {
+  created() {
+    this.getTableHeight()
+    this.getDataList()
+    this.getUserProjectDataList()
+  },
+  methods:{
+    submitForm(){
+      this.$refs["form"].validate(async valid => {
+          if (valid) {
+            if (this.form.id == undefined) {
+
+            }else {
+              edit(this.form).then(res =>{
+                if(200 == res.code){
+                  this.$message.success("修改成功")
+                  this.editDialog = false
+                  this.getDataList()
+                }
+              })
+            }
+          }
+      })
+    },
+    handleClose(done) {
+      this.$confirm('确认关闭?')
+        .then(_ => {
+          done();
+        })
+        .catch(_ => {});
+    },
+    edit(param){
+      this.editDialog=true;
+      this.form=param
+    },
+    remove(param){
+      this.$confirm('确认删除?')
+        .then(_ => {
+          deleteById(param).then(res =>{
+            if(200 == res.code){
+              this.$message.success("删除成功")
+              this.getDataList()
+            }
+          })
+        })
+        .catch(_ => {});
+    },
+    getDataList(){
+      getList(this.queryParams).then(res =>{
+        if(200 == res.code){
+          this.dataList=res.rows
+          this.total=res.total
+        }
+      })
+    },
+    getUserProjectDataList(){
+      getUserProjectList().then(res =>{
+        if(200 == res.code){
+          this.userProjectList=res.data
+        }
+      })
+    },
+    handleSizeChange(val) {
+      this.queryParams.pageSize = val
+      this.getDataList()
+    },
+    handleCurrentChange(val) {
+      this.queryParams.pageNum = val
+      this.getDataList()
+    },
+    //计算table高度(动态设置table高度)
+    getTableHeight() {
+      let tableH = 150; //距离页面下方的高度
+      let tableHeightDetil = window.innerHeight - tableH;
+      if (tableHeightDetil <= 300) {
+        this.tableHeight = 300;
+      } else {
+        this.tableHeight = window.innerHeight - tableH;
+      }
+    },
+  },
+  data() {
+    return {
+      editDialog:false,
+      tableHeight:'', //表格高度
+      total:'',
+      dataList:[],
+      userProjectList:[],
+      queryParams:{
+        pageNum:1,
+        pageSize:10,
+        userName:'',
+        userProject:'',
+        userRoom:'',
+        userPhone:'',
+      },
+      form:{
+        id:undefined,
+        userName:'',
+        userProject:'',
+        userRoom:'',
+        userPhone:'',
+      }
+    }
+  }
+}
+</script>
+
+<style>
+
+</style>

+ 98 - 40
src/views/business/as/hospital/assignAuthority/index.vue

@@ -1,21 +1,23 @@
 <template>
   <div class="assignAuthority">
-    <el-row :gutter="10" type="flex" class="row-bg" justify="space-between">
+    <el-row type="flex" class="row-bg" justify="space-between">
      <el-col :span="6">
        <h3>权限分配</h3>
      </el-col>
-      <el-col :span="10">
+      <el-col :span="8">
        <el-form ref="queryParams" :model="queryParams">
          <el-form-item>
            <el-input v-model="queryParams.nickName" placeholder="请输入姓名、部门"></el-input>
          </el-form-item>
        </el-form>
       </el-col>
-      <el-col :span="6" >
+      <el-col :span="6" style="margin-left: 10px">
         <el-button type="primary" @click="queryBtn">搜索</el-button>
+        <el-button type="primary" @click="resetBtn">重置</el-button>
       </el-col>
-     <el-col :span="6" >
+     <el-col :span="4" >
        <el-button type="primary" @click="addBtn">新增</el-button>
+<!--       <el-button type="primary" @click="removeBtn">删除</el-button>-->
      </el-col>
     </el-row>
     <el-divider></el-divider>
@@ -26,7 +28,12 @@
       :header-cell-style="{'text-align':'center'}"
       :cell-style="{'text-align':'center'}"
       border
-      style="width: 100%;margin-top: 20px">
+      style="width: 100%;margin-top: 20px"
+      @selection-change="handleSelectionChange1">
+      <el-table-column
+        type="selection"
+        width="55">
+      </el-table-column>
       <el-table-column
         label="序号"
         width="100">
@@ -46,7 +53,6 @@
       </el-table-column>
       <el-table-column
         prop="isDefaultPerson"
-        fixed="right"
         label="是否为问题默认处理人">
         <template #default="scope">
           <el-select v-model="scope.row.isDefaultPerson" placeholder="请选择" @change="changeBtn(scope.row)">
@@ -76,12 +82,12 @@
       :title="title"
       :visible.sync="dialogVisible"
       width="80%"
-      :before-close="handleClose">
+      :before-close="userQueryHandleClose">
       <el-row :gutter="10">
         <el-col :span="10">
-          <el-form ref="queryParams" :model="queryParams" label-width="90px">
+          <el-form ref="userQueryParams" :model="userQueryParams" label-width="90px">
             <el-form-item label="名称/编号">
-              <el-input v-model="queryParams.userName" placeholder="请输入名称/编号"></el-input>
+              <el-input v-model="userQueryParams.userName" placeholder="请输入名称/编号"></el-input>
             </el-form-item>
           </el-form>
         </el-col>
@@ -89,7 +95,7 @@
           <el-button type="primary" @click="queryUserBtn">搜索</el-button>
         </el-col>
         <el-col :span="2">
-          <el-button @click="">重置</el-button>
+          <el-button @click="userQueryParamReset">重置</el-button>
         </el-col>
       </el-row>
       <el-row>
@@ -119,46 +125,53 @@
         <el-pagination
           @size-change="handleSizeChange2"
           @current-change="handleCurrentChange2"
-          :current-page=this.queryParams.pageNum
+          :current-page=this.userQueryParams.pageNum
           :page-sizes="[10,20,50,100]"
-          :page-size=this.queryParams.pageSize
+          :page-size=this.userQueryParams.pageSize
           layout="total, sizes, prev, pager, next, jumper"
           :total=this.userTotal>
         </el-pagination>
       </el-row>
       <span slot="footer" class="dialog-footer">
-    <el-button @click="dialogVisible = false">取 消</el-button>
+    <el-button @click="userQueryCancel">取 消</el-button>
     <el-button type="primary" @click="addUserBtn">确 定</el-button>
   </span>
     </el-dialog>
   </div>
 </template>
 <script>
-import {addUser, list, userList,edit} from "@/api/business/as/assignAuthority";
+import {addUser, list, userList, edit, removeByIdList} from "@/api/business/as/assignAuthority";
 
 export default {
   created() {
+    this.getTableHeight()
     if(this.$route.query.id){
       this.queryParams.hId=this.$route.query.id
-      this.queryBtn()
+      list(this.queryParams).then(res =>{
+        if(res.code == 200){
+          this.dataList=res.rows
+          this.total=res.total
+        }
+      })
     }
   },
-  mounted() {
-    //挂载window.onresize事件(动态设置table高度)
-    let _this = this;
-    window.onresize = () => {
-      if (_this.resizeFlag) {
-        clearTimeout(_this.resizeFlag);
-      }
-      _this.resizeFlag = setTimeout(() => {
-        _this.getTableHeight();
-        _this.resizeFlag = null;
-      }, 100);
-    };
-  },
   methods:{
+    //批量删除用户
+    removeBtn(){
+      removeByIdList(this.removeList).then(res =>{
+      })
+    },
+    /**
+     * 获取项目已有用户
+     */
+    handleSelectionChange1(val){
+      for (let i = 0; i < val.length; i++) {
+        // 为arrayC添加名称为arrayB[i].id的属性字段,值等于arrayB[i].name
+        this.removeList[i] = val[i].id
+        // arrayC[arrayB[i].id] = arrayB[i].dev_name
+      }
+    },
     changeBtn(row){
-      console.log('row',row)
       edit(row).then(res =>{
         if(res.code == 200){
           this.$message.success("修改成功")
@@ -169,8 +182,7 @@ export default {
         }
       })
     },
-    queryBtn(){
-      this.queryParams.deptName=this.queryParams.nickName
+    getList(){
       list(this.queryParams).then(res =>{
         if(res.code == 200){
           this.dataList=res.rows
@@ -178,9 +190,23 @@ export default {
         }
       })
     },
+    queryBtn(){
+      this.queryParams.deptName=this.queryParams.nickName
+      this.getList()
+    },
+    resetBtn(){
+      this.queryParams={
+        hId:this.$route.query.id,
+        pageNum:1,
+        pageSize:10,
+        userName:'',
+        nickName:'',
+        deptName:'',
+      }
+      this.getList()
+    },
     handleSelectionChange(val) {
       this.userFormList = val;
-      console.log("this.userFormList",this.userFormList)
       this.userFormList.forEach((item) =>{
         item.hid=this.queryParams.hId
       })
@@ -190,28 +216,53 @@ export default {
         if(res.code == 200){
           this.$message.success("新增成功")
           this.dialogVisible = false
+          this.userQueryParamReset()
+          this.queryBtn()
         }
       })
-      this.queryBtn()
     },
     queryUserBtn(){
-      this.queryParams.nickName=this.queryParams.userName
-      userList(this.queryParams).then(res =>{
+      this.userQueryParams.nickName=this.userQueryParams.userName
+      userList(this.userQueryParams).then(res =>{
         if(res.code == 200){
-          console.log("res.rows",res.rows)
           this.userDataList = res.rows
           this.userTotal=res.total
         }
       })
     },
+    userQueryParamReset(){
+      this.userQueryParams={
+        pageNum:1,
+        pageSize:10,
+        userName:'',
+        nickName:'',
+      }
+    },
+    userQueryHandleClose(done){
+      this.$confirm('确认关闭?')
+        .then(_ => {
+          done()
+          this.userQueryParamReset()
+        })
+        .catch(_ => {});
+    },
+    userQueryCancel(){
+      this.dialogVisible=false
+      this.userQueryParamReset()
+    },
     addBtn(){
       this.dialogVisible=true
       this.title="需求人员"
-      this.queryUserBtn()
+      userList().then(res =>{
+        if(res.code == 200){
+          this.userDataList = res.rows
+          this.userTotal=res.total
+        }
+      })
     },
     //计算table高度(动态设置table高度)
     getTableHeight() {
-      let tableH = 150; //距离页面下方的高度
+      let tableH = 160; //距离页面下方的高度
       let tableHeightDetil = window.innerHeight - tableH;
       if (tableHeightDetil <= 300) {
         this.tableHeight = 300;
@@ -224,7 +275,7 @@ export default {
       this.queryBtn()
     },
     handleSizeChange2(val) {
-      this.queryParams.pageSize = val
+      this.userQueryParams.pageSize = val
       this.queryUserBtn()
     },
     handleCurrentChange1(val) {
@@ -232,12 +283,13 @@ export default {
       this.queryBtn()
     },
     handleCurrentChange2(val) {
-      this.queryParams.pageNum = val
+      this.userQueryParams.pageNum = val
       this.queryUserBtn()
     },
   },
   data(){
     return {
+      removeList:[],
       isOptions:[
         {
           value: '1',
@@ -257,6 +309,12 @@ export default {
       loading:false,
       total:0,
       tableHeight:'', //表格高度
+      userQueryParams:{
+        pageNum:1,
+        pageSize:10,
+        userName:'',
+        nickName:'',
+      },
       queryParams:{
         hId:undefined,
         pageNum:1,

+ 152 - 15
src/views/business/as/hospital/index.vue

@@ -37,6 +37,16 @@
         width="240">
       </el-table-column>
       <el-table-column
+        prop="defaultContactWay"
+        label="默认联系方式"
+        width="180">
+      </el-table-column>
+      <el-table-column
+        prop="wechatRoomNickName"
+        label="微信群"
+        width="410">
+      </el-table-column>
+      <el-table-column
         prop="remark"
         label="备注"
         width="240">
@@ -45,7 +55,8 @@
         fixed="right"
         label="操作">
         <template #default="scope">
-          <el-button type="text">编辑</el-button>|
+          <el-button type="text" @click="createBtn(scope.row)">生成链接</el-button>|
+          <el-button type="text" @click="editBtn(scope.row)">编辑</el-button>|
           <el-button type="text" @click="routerBtn(scope.row)">权限分配</el-button>|
           <el-button type="text" @click="delBtn(scope.row)">删除</el-button>
         </template>
@@ -66,22 +77,61 @@
       :visible.sync="dialogVisible"
       width="30%"
       :before-close="handleClose">
-      <el-form ref="form" :model="form" label-width="130px">
-        <el-form-item label="项目/医院名称">
+      <el-form ref="form" :model="form" :rules="rules" label-width="130px">
+        <el-form-item label="项目/医院名称" prop="projectSource">
           <el-input v-model="form.projectSource"></el-input>
         </el-form-item>
+        <el-form-item label="默认联系方式">
+          <el-input v-model="form.defaultContactWay"></el-input>
+        </el-form-item>
+        <el-form-item label="微信群" prop="wechatRoom">
+          <el-select v-model="form.wechatRoom" filterable clearable placeholder="请选择" style="width: 100%">
+            <el-option
+              v-for="item in wechatRoomOptions"
+              :key="item.id"
+              :label="item.nickName"
+              :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="默认处理人" prop="defaultUserName">
+          <el-select v-model="form.defaultUserName" filterable clearable placeholder="请选择" style="width: 100%">
+            <el-option
+              v-for="item in DefaultPersonList"
+              :key="item.userName"
+              :label="item.nickName"
+              :value="item.userName">
+              <span style="float: left">{{ item.nickName }}</span>
+              <span style="float: right; color: #8492a6; font-size: 13px">{{ item.userName }}</span>
+            </el-option>
+          </el-select>
+        </el-form-item>
       </el-form>
       <span slot="footer" class="dialog-footer">
-    <el-button @click="dialogVisible = false">取 消</el-button>
-    <el-button type="primary" @click="submitForm">确 定</el-button>
-  </span>
+        <el-button @click="resetForm('form')">取 消</el-button>
+        <el-button type="primary" @click="submitForm('form')">确 定</el-button>
+      </span>
+    </el-dialog>
+
+    <el-dialog
+      title="项目链接"
+      :visible.sync="createDialog"
+      width="30%"
+      :before-close="handleClose">
+      <span>{{ this.projectUrl }}</span>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="createDialog = false">取 消</el-button>
+        <el-button type="primary" @click="createDialog = false">确 定</el-button>
+      </span>
     </el-dialog>
   </div>
 
 
 </template>
 <script>
-import {add,edit,list,remove} from '@/api/business/as/hospital'
+import {add, edit, getWeChatRoomList, list, remove} from '@/api/business/as/hospital'
+import {getToken} from "@/utils/auth";
+import {userAllList, userList} from "@/api/business/as/assignAuthority";
 export default {
   mounted() {
     //挂载window.onresize事件(动态设置table高度)
@@ -98,9 +148,49 @@ export default {
   },
   created() {
     this.getData()
-    this.getTableHeight();
+    this.getTableHeight()
+    this.getWeChatRoomData()
   },
   methods:{
+    createBtn(param){
+      this.createDialog=true
+      this.projectUrl = `https://sy.derom.com/drp/after-sales/login/${param.id}`
+      // if(process.env.NODE_ENV == "development"){
+      //   this.projectUrl =`http://127.0.0.1/drp/after-sales/login/${param.id}`
+      // }else if(process.env.NODE_ENV == "production"){
+      //   this.projectUrl = `https://sy.derom.com/drp/after-sales/login/${param.id}`
+      // }else if(process.env.NODE_ENV == "staging"){
+      //   this.projectUrl = `https://dev-sy.derom.com/drp/after-sales/login/${param.id}`
+      // }
+    },
+    getWeChatRoomData(){
+      getWeChatRoomList().then(res =>{
+        if(200 == res.code){
+          this.wechatRoomOptions=res.data
+        }
+      })
+    },
+    getDefaultPerson(){
+      userAllList().then(res =>{
+        if(res.code == 200){
+          this.DefaultPersonList = res.data
+        }
+      })
+    },
+    bingBtn(param){
+      edit(param).then(res =>{
+        if(res.code == 200){
+          this.$modal.msgSuccess("修改成功");
+        }
+      })
+    },
+    editBtn(param){
+      this.getWeChatRoomData()
+      this.getDefaultPerson()
+      this.dialogVisible=true
+      this.title='编辑'
+      this.form=param
+    },
     routerBtn(row,event,colum) {
       let resolve = this.$router.push({path:'/business/as/hospital/assignAuthority',query:{id:row.id}});
     },
@@ -127,9 +217,11 @@ export default {
     },
     handleSizeChange(val) {
       this.queryParams.pageSize = val
+      this.getData()
     },
     handleCurrentChange(val) {
       this.queryParams.pageNum = val
+      this.getData()
     },
     handleClose(done) {
       this.$confirm('确认关闭?')
@@ -139,6 +231,9 @@ export default {
         .catch(_ => {});
     },
     addBtn() {
+      this.cancel()
+      this.getWeChatRoomData()
+      this.getDefaultPerson()
       this.dialogVisible=true
       this.title="新增"
     },
@@ -154,26 +249,45 @@ export default {
         })
         .catch(_ => {});
     },
-    cancal(){
+    cancel(){
       this.form={
         id:undefined,
-        projectSource:''
+        projectSource:'',
+        defaultContactWay:'',
+        wechatRoom:'',
+        wechatRoomNickName:''
       }
     },
-    submitForm(){
-      this.$refs["form"].validate( valid => {
+    resetForm(formName) {
+      this.dialogVisible = false
+    },
+    submitForm(form){
+      this.$refs[form].validate( valid => {
         if (valid) {
+          this.wechatRoomOptions.forEach((item) =>{
+            if(this.form.wechatRoom == item.id){
+              this.form.wechatRoomNickName=item.nickName
+            }
+          })
+          this.DefaultPersonList.forEach((item) =>{
+            if(this.form.defaultUserName == item.userName){
+              this.form.defaultDeptId=item.deptId
+              this.form.defaultDeptName=item.deptName
+              this.form.defaultNickName=item.nickName
+              this.form.defaultPhoneNumber=item.phoneNumber
+            }
+          })
           if (this.form.id == undefined) {
             add(this.form).then(res =>{
               if(res.code == 200){
                 this.$modal.msgSuccess("新增成功");
                 this.dialogVisible = false
-                this.cancal()
+                this.cancel()
                 this.getData()
               }
             })
           }else {
-            edit().then(res =>{
+            edit(this.form).then(res =>{
               if(res.code == 200){
                 this.$modal.msgSuccess("修改成功");
                 this.dialogVisible = false
@@ -186,11 +300,15 @@ export default {
   },
   data() {
     return {
+      DefaultPersonList:[],
+      projectUrl:'',
+      createDialog:false,
       dialogVisible:false,
       loading:false,
       tableHeight:'', //表格高度
       title:'',
       total:'',
+      wechatRoomOptions:[],
       dataList:[],
       queryParams:{
         pageNum:1,
@@ -199,7 +317,26 @@ export default {
       },
       form:{
         id:undefined,
-        projectSource:''
+        projectSource:'',
+        defaultContactWay:'',
+        wechatRoom:'',
+        wechatRoomNickName:'',
+        defaultUserName:'',
+        defaultDeptId:'',
+        defaultDeptName:'',
+        defaultNickName:'',
+        defaultPhoneNumber:''
+      },
+      rules:{
+        projectSource: [
+          { required: true, message: '请输入项目名称', trigger: 'blur' },
+        ],
+        wechatRoom: [
+          { required: true, message: '请选择项目微信群', trigger: 'change' }
+        ],
+        defaultUserName: [
+          { required: true, message: '请选择默认处理人', trigger: 'change' }
+        ],
       }
     }
   }

+ 112 - 81
src/views/business/as/problemInfo/detail.vue

@@ -6,8 +6,8 @@
             <el-col :span="6" v-if="flag">工单详情(待解决)</el-col>
             <el-col :span="6" v-if="flag == false" > 工单详情</el-col>
             <el-col :span="2" >
-              <el-button type="text" @click="handleSolve"> 解决</el-button>
-              <el-button type="text" @click="handleWorkOrder"> 转单</el-button>
+              <el-button type="primary" @click="handleSolve"> 解决</el-button>
+<!--              <el-button type="text" @click="handleWorkOrder"> 转单</el-button>-->
             </el-col>
           </el-row>
           <el-divider></el-divider>
@@ -20,43 +20,19 @@
         <el-col :span="flag==false?20:24">
           <el-descriptions>
             <el-descriptions-item label="问题编码">{{ this.data.problemCode }}</el-descriptions-item>
-            <el-descriptions-item label="来源项目/医院">
-              <el-select v-model="this.data.projectSource" placeholder="请选择">
-                <el-option
-                  v-for="item in options"
-                  :key="item.value"
-                  :label="item.label"
-                  :value="item.value">
-                </el-option>
-              </el-select>
+            <el-descriptions-item label="来源项目/医院">{{this.data.projectSource}}
             </el-descriptions-item>
             <el-descriptions-item label="创建时间">{{ this.data.createTime }}</el-descriptions-item>
           </el-descriptions>
-          <el-descriptions column="2">
+          <el-descriptions :column="3">
             <el-descriptions-item label="提问人">{{ this.data.questioner }}</el-descriptions-item>
             <el-descriptions-item label="科室信息">{{this.data.roomInformation}}</el-descriptions-item>
-            <el-descriptions-item label="问题类别">
-              <el-select v-model="this.data.problemType" placeholder="请选择">
-                <el-option
-                  v-for="item in problemTypeOptions"
-                  :key="item.value"
-                  :label="item.label"
-                  :value="item.value">
-                </el-option>
-              </el-select>
-            </el-descriptions-item>
-            <el-descriptions-item label="处理负责人">
-              <el-select v-model="this.data.processor" placeholder="请选择">
-                <el-option
-                  v-for="item in options"
-                  :key="item.value"
-                  :label="item.label"
-                  :value="item.value">
-                </el-option>
-              </el-select>
-            </el-descriptions-item>
           </el-descriptions>
-          <el-descriptions column="1">
+          <el-descriptions :column="3">
+            <el-descriptions-item label="问题类别">{{getChangeType2(this.data.problemType)}}</el-descriptions-item>
+            <el-descriptions-item label="处理负责人">{{this.data.processorName}}</el-descriptions-item>
+          </el-descriptions>
+          <el-descriptions :column="3">
             <el-descriptions-item label="问题描述">
               <el-input
                 type="textarea"
@@ -67,39 +43,68 @@
               </el-input>
             </el-descriptions-item>
           </el-descriptions>
-          <el-descriptions column="1">
+          <el-descriptions :column="3">
             <el-descriptions-item label="问题图片">
-              <div class="block" v-for="fit in this.data.problemPicture" :key="fit.id">
+              <div class="block" v-for="v in this.data.problemPicture" :key="v.id">
                 <el-image
                   style="width: 100px; height: 100px;margin-left: 20px"
-                  :src="fit.filepath"
-                  :fit="contain">
+                  :src="v.filepath"
+                  :preview-src-list="previewProblemList">
+                </el-image>
+              </div>
+            </el-descriptions-item>
+          </el-descriptions>
+
+          <el-divider v-if="flag1==true"></el-divider>
+          <el-descriptions v-if="flag1==true">
+            <el-descriptions-item label="问题处理人">{{ this.data.processorName }}</el-descriptions-item>
+          </el-descriptions>
+          <el-descriptions :column="1" v-if="flag1==true">
+            <el-descriptions-item label="处理反馈">
+              <el-input
+                type="textarea"
+                :rows="2"
+                placeholder="请输入内容"
+                v-model="this.data.processingFeedback"
+                disabled>
+              </el-input>
+            </el-descriptions-item>
+          </el-descriptions>
+          <el-descriptions :column="1" v-if="flag1==true">
+            <el-descriptions-item label="处理图片">
+              <div class="block" v-for="(item,index) in this.data.processorPicture">
+                <el-image
+                  style="width: 100px; height: 100px;margin-left: 20px"
+                  :src="item.filepath"
+                  :preview-src-list="previewProcessorList">
                 </el-image>
               </div>
             </el-descriptions-item>
           </el-descriptions>
         </el-col>
-        <el-col :span="4" v-if="flag==false" style="height: 1000px">
+        <el-col :span="4" v-if="flag==false" style="height: 600px">
           <el-timeline :reverse="reverse">
             <el-timeline-item
               v-for="(activity, index) in this.data.processFlow"
               :key="index"
               :timestamp="activity.timestamp">
-              {{activity.content}}
+              {{ activity.content+'\n'+'处理人:'+activity.processorName+activity.processorWay }}
             </el-timeline-item>
           </el-timeline>
         </el-col>
       </el-row>
-
+      <el-row type="flex" justify="end">
+        <el-button type="primary" @click="returnPage">返回</el-button>
+      </el-row>
       <el-dialog
         title="确认该问题已解决?"
         :visible.sync="dialogSolve"
         width="30%"
         :before-close="handleClose">
-        <el-form ref="form" :model="form" label-width="100px">
+        <el-form ref="form" :model="form" :rules="rules" label-width="100px">
           <el-row>
             <el-col :span="15">
-              <el-form-item label="描述">
+              <el-form-item label="描述" prop="processingFeedback">
                 <el-input
                   v-model="form.processingFeedback"
                   type="textarea"
@@ -116,9 +121,11 @@
                   class="upload-demo"
                   ref="upload"
                   list-type="picture-card"
-                  :file-list="form.processorPicture"
+                  :file-list="this.previewProcessorList"
+                  action="#"
                   :on-change="handleChange"
                   :on-remove="handleRemove"
+                  :on-preview="handlePictureCardPreview"
                   :auto-upload="false"
                   :limit="1"
                 >
@@ -144,12 +151,12 @@
           <el-row>
             <el-col :span="15">
               <el-form-item >
-                <el-select v-model="form.workOrderProcessor" placeholder="请选择工单处理人">
+                <el-select v-model="form.workOrderProcessor" filterable="true" placeholder="请选择工单处理人" clearable>
                   <el-option
-                    v-for="item in processorOptions"
-                    :key="item.userCode"
+                    v-for="item in workOrderProcessorOptions"
+                    :key="item.userName"
                     :label="item.nickName"
-                    :value="item.userCode">
+                    :value="item.userName">
                   </el-option>
                 </el-select>
               </el-form-item>
@@ -172,15 +179,13 @@
         <el-button type="primary" @click="submitFormWorkOrder">确 定</el-button>
       </el-dialog>
     </div>
-
-
 </template>
 
 <script>
 import {getDetail} from "@/api/business/as/detail";
 import axios from "axios";
 import {getToken} from "@/utils/auth";
-import {pushWorkOrder} from "@/api/business/as/problemInfo";
+import {getProcessorOptions, getWorkOrderProcessorList, pushWorkOrder} from "@/api/business/as/problemInfo";
 
 export default {
   created() {
@@ -189,14 +194,47 @@ export default {
       getDetail(this.queryParams.id).then(res => {
         if(200 == res.code){
           this.data=res.data
-          if(this.data.problemStateSolve == 0){
+          this.hospitalId=res.data.hospitalId
+          if(res.data.problemPicture!=null&&res.data.problemPicture.length>0){
+            res.data.problemPicture.forEach(item =>{
+              this.previewProblemList.push(item.filepath)
+            })
+          }
+          if(res.data.processorPicture!=null&&res.data.processorPicture.length>0){
+            res.data.processorPicture.forEach(item =>{
+              this.previewProcessorList.push(item.filepath)
+            })
+          }
+          if(res.data.problemStateSolve == 0 || res.data.problemStateConvert == 0){
             this.flag=false
           }
+          if(res.data.problemStateSolve == 0){
+            this.flag1=true
+          }
         }
       })
     }
   },
   methods:{
+    getChangeType2(e) {
+      for (var i = 0; i < this.problemTypeOptions.length; i++) {
+        if (this.problemTypeOptions[i].value === e) { //dictValue,dictLabel保持和上面定义一致
+          return this.problemTypeOptions[i].label;
+        }
+      }
+    },
+    getPreviewProblemList(val){
+      this.previewProblemList.push(val)
+      return this.previewProblemList
+    },
+    returnPage(){
+      this.$router.go(-1)
+    },
+    //预览图片功能
+    handlePictureCardPreview(file) {
+      this.dialogVisiblePicture = true
+      this.dialogImageUrl = file.url
+    },
     submitFormWorkOrder(){
       pushWorkOrder(this.form).then(res =>{
         if(res.code == 200){
@@ -224,7 +262,7 @@ export default {
       }
       return await axios({
         method: "POST",
-        url: process.env.VUE_APP_BASE_API + '/mk/as/problem/editSolve',
+        url: process.env.VUE_APP_BASE_API + '/mk/as/problem/editSolve1',
         headers: {
           'Content-Type': 'multipart/form-data',
           'Authorization': 'Bearer ' + getToken()
@@ -234,6 +272,11 @@ export default {
         if(res.data.code == 200){
           this.$modal.msgSuccess("修改成功");
           this.dialogSolve = false
+          getDetail(this.queryParams.id).then(res => {
+            if(200 == res.code){
+              this.data=res.data
+            }
+          })
         }
       })
     },
@@ -249,25 +292,6 @@ export default {
       this.form.problemPicture=fileList
     },
     handleClose(done) {
-      // this.form = {
-      //   id:undefined,
-      //   problemCode:'',
-      //   projectSource:'',
-      //   questioner:'',
-      //   problemType:'',
-      //   roomInformation:'',
-      //   processor:'',
-      //   processorWay:'',
-      //   problemDescription:'',
-      //   problemPicture:[],
-      //   questionerWay:'',
-      //   processingFeedback:'',
-      //   problemStateSolve:'',
-      //   problemStateConvert:'',
-      //   processorPicture:[],
-      //   workOrderProcessor:'',
-      //   processorEndTime:'',
-      // }
       this.$confirm('确认关闭?')
         .then(_ => {
           done();
@@ -279,23 +303,24 @@ export default {
       this.form=this.data
     },
     handleWorkOrder(){
+      getProcessorOptions(this.hospitalId).then(res =>{
+        if(res.code == 200){
+          this.workOrderProcessorOptions=res.data
+        }
+      })
       this.dialogWorkOrder=true
       this.form=this.data
     },
   },
   data() {
     return {
+      previewProcessorList:[],
+      previewProblemList:[],
+      hospitalId:'',
+      dialogImageUrl:'',
+      dialogVisiblePicture: false,
+      workOrderProcessorOptions:[],
       pictureList:[],
-      processorOptions:[
-        {
-          userCode: '10001',
-          nickName: '王五'
-        },
-        {
-          userCode: '10002',
-          nickName: '张三'
-        }
-      ],
       form: {
         id:undefined,
         problemCode:'',
@@ -315,6 +340,11 @@ export default {
         workOrderProcessor:'',
         processorEndTime:'',
       },
+      rules: {
+        processingFeedback: [
+          { required: true, message: '请输入处理反馈', trigger: 'blur' },
+        ],
+      },
       dialogSolve:false,
       dialogWorkOrder:false,
       problemTypeOptions:[
@@ -340,6 +370,7 @@ export default {
         id:undefined,
       },
       flag:true,
+      flag1:false,
       reverse: false,
     }
   }

Разлика између датотеке није приказан због своје велике величине
+ 476 - 198
src/views/business/as/problemInfo/index.vue


+ 49 - 31
src/views/business/bid/detail/bidingInfoDetail.vue

@@ -23,16 +23,16 @@
     <el-descriptions-item label="招标状态" ></el-descriptions-item>
   </el-descriptions>
     <el-descriptions class="margin-top" title="公告主题信息" :column="2"  border >
-      <el-descriptions-item label="招标单位" >{{this.dataList.zhaoBiaoUnitTempDtos[0].zhaoBiaoUnit}}</el-descriptions-item>
-      <el-descriptions-item label="招标单位联系人">{{this.dataList.zhaoBiaoUnitTempDtos[0].zhaoRelationName}}</el-descriptions-item>
-      <el-descriptions-item label="招标单位联系电话">{{this.dataList.zhaoBiaoUnitTempDtos[0].zhaoRelationWay}}</el-descriptions-item>
-      <el-descriptions-item label="代理单位" >{{this.dataList.agentUnitTempDtos.length == 0 ?  null: this.dataList.agentUnitTempDtos[0].agentUnit}}</el-descriptions-item>
-      <el-descriptions-item label="代理单位联系人" >{{this.dataList.agentUnitTempDtos.length == 0 ?  null: this.dataList.agentUnitTempDtos[0].agentRelationName}}</el-descriptions-item>
-      <el-descriptions-item label="代理单位联系方式" >{{this.dataList.agentUnitTempDtos.length == 0 ?  null: this.dataList.agentUnitTempDtos[0].agentRelationWay}}</el-descriptions-item>
+      <el-descriptions-item label="招标单位" >{{(this.dataList.zhaoBiaoUnitTempDtos!=null&&this.dataList.zhaoBiaoUnitTempDtos.length == 0) ? null:this.dataList.zhaoBiaoUnitTempDtos[0].zhaoBiaoUnit}}</el-descriptions-item>
+      <el-descriptions-item label="招标单位联系人">{{(this.dataList.zhaoBiaoUnitTempDtos!=null&&this.dataList.zhaoBiaoUnitTempDtos.length == 0) ? null : this.dataList.zhaoBiaoUnitTempDtos[0].zhaoRelationName}}</el-descriptions-item>
+      <el-descriptions-item label="招标单位联系电话">{{(this.dataList.zhaoBiaoUnitTempDtos!=null&&this.dataList.zhaoBiaoUnitTempDtos.length == 0) ? null : this.dataList.zhaoBiaoUnitTempDtos[0].zhaoRelationWay}}</el-descriptions-item>
+      <el-descriptions-item label="代理单位" >{{(this.dataList.agentUnitTempDtos!=null&&this.dataList.agentUnitTempDtos.length == 0) ?  null: this.dataList.agentUnitTempDtos[0].agentUnit}}</el-descriptions-item>
+      <el-descriptions-item label="代理单位联系人" >{{(this.dataList.agentUnitTempDtos!=null&&this.dataList.agentUnitTempDtos.length == 0) ?  null: this.dataList.agentUnitTempDtos[0].agentRelationName}}</el-descriptions-item>
+      <el-descriptions-item label="代理单位联系方式" >{{(this.dataList.agentUnitTempDtos!=null&&this.dataList.agentUnitTempDtos.length == 0) ?  null: this.dataList.agentUnitTempDtos[0].agentRelationWay}}</el-descriptions-item>
       <el-descriptions-item label="联系地址" ></el-descriptions-item>
-      <el-descriptions-item label="中标单位" >{{this.dataList.zhongBiaoUnitTempDtos.length == 0 ?  null: this.dataList.zhongBiaoUnitTempDtos[0].zhongBiaoUnit}}</el-descriptions-item>
-      <el-descriptions-item label="中标单位联系人" >{{this.dataList.zhongBiaoUnitTempDtos.length == 0 ?  null: this.dataList.zhongBiaoUnitTempDtos[0].zhongRelationName}}</el-descriptions-item>
-      <el-descriptions-item label="中标单位联系人电话" >{{this.dataList.zhongBiaoUnitTempDtos.length == 0 ?  null: this.dataList.zhongBiaoUnitTempDtos[0].zhongRelationWay}}</el-descriptions-item>
+      <el-descriptions-item label="中标单位" >{{(this.dataList.zhongBiaoUnitTempDtos!=null&&this.dataList.zhongBiaoUnitTempDtos.length == 0) ?  null: this.dataList.zhongBiaoUnitTempDtos[0].zhongBiaoUnit}}</el-descriptions-item>
+      <el-descriptions-item label="中标单位联系人" >{{(this.dataList.zhongBiaoUnitTempDtos!=null&&this.dataList.zhongBiaoUnitTempDtos.length == 0) ?  null: this.dataList.zhongBiaoUnitTempDtos[0].zhongRelationName}}</el-descriptions-item>
+      <el-descriptions-item label="中标单位联系人电话" >{{(this.dataList.zhongBiaoUnitTempDtos!=null&&this.dataList.zhongBiaoUnitTempDtos.length == 0) ?  null: this.dataList.zhongBiaoUnitTempDtos[0].zhongRelationWay}}</el-descriptions-item>
       <el-descriptions-item label="中标合同开始时间" >
             <el-date-picker
               :disabled="contractInputVisible"
@@ -109,21 +109,26 @@
   </el-descriptions>
   <el-descriptions class="margin-top" title="公告详情信息"  border>
     <el-descriptions-item label="公告原文" >
-      <el-button type="info" @click="goToBasic()">原文</el-button>
+      <el-button type="info" @click="openInfoDetail">原文</el-button>
     </el-descriptions-item>
   </el-descriptions>
-  <el-button type="primary" @click="returnPage">返回</el-button>
+  <el-row type="flex" justify="end">
+    <el-col :span="2">
+      <el-button type="primary" @click="returnPage">返回</el-button>
+    </el-col>
+  </el-row>
 
   <el-dialog
     :visible.sync="dialogVisible"
+    v-if="dialogVisible"
     width="100%"
-    :before-close="handleClose">
-
-    <span slot="footer" class="dialog-footer">
-    <el-button @click="dialogVisible = false">取 消</el-button>
-    <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
-    </span>
+    :before-close="handleClose"
+    :modal="false"
+    fullscreen
+  >
+    <Detail :detailId="this.detailId" @change="costPlannedAmountChange($event)"></Detail>
   </el-dialog>
+
 </div>
 </template>
 <script>
@@ -131,8 +136,22 @@
 import {QueryById, updateContractTime} from "@/api/business/bid/biding";
 
 export default {
+  name: "bidingInfoDetailMenu",
+  components:{
+    Detail : () => import("@/views/business/bid/detail/detail.vue"),
+  },
+  props:{
+    lastData:{
+      type: [String,Number]
+    },
+  },
+  created() {
+    this.getDetail(this.lastData)
+  },
   data() {
     return {
+      detailId:'',
+      returnPageQueryParam:'',
       contractStartTime:'',
       contractEndTime:'',
       contractInputVisible:true,
@@ -232,13 +251,18 @@ export default {
       ],
     };
   },
-  created() {
-    if(this.$route.query.id){
-      this.$route.query
-      this.getDetail(this.$route.query.id)
-    }
-  },
+
   methods:{
+    async costPlannedAmountChange(value){
+      this.dialogVisible=value
+    },
+    handleClose(done) {
+      this.$confirm('确认关闭?')
+        .then(_ => {
+          done();
+        })
+        .catch(_ => {});
+    },
     contractEditHandle(){
       this.contractInputVisible=false
     },
@@ -256,14 +280,8 @@ export default {
       this.$router.push({path:'/business/bid/detail',query:{id:this.dataList.infoId}});
     },
 
-    handleClose(done) {
-      this.$confirm('确认关闭?')
-        .then(_ => {
-          done();
-        })
-        .catch(_ => {});
-    },
     openInfoDetail(){
+      this.detailId=this.dataList.infoId
       this.dialogVisible=true
     },
     getDetail(val){
@@ -280,7 +298,7 @@ export default {
     //   return str1 - new Date().getTime();
     // },
     returnPage(){
-      this.$router.go(-1)
+      this.$emit('change', false);
     },
     getChangeType(e) {
       for (var i = 0; i < this.noticeOneType.length; i++) {

+ 12 - 31
src/views/business/bid/detail/detail.vue

@@ -76,12 +76,21 @@
         </p>
       </div>
     </div>
+    <el-row type="flex" justify="end">
+      <el-button type="primary" @click="returnPage">返回</el-button>
+    </el-row>
   </ul>
+
 </template>
 <script>
 import {getDetailByInfoId, QueryById} from "@/api/business/bid/biding";
 
 export default {
+  props:{
+    detailId:{
+      type: [String,Number]
+    },
+  },
   data() {
     return {
       dialogVisible:false,
@@ -176,34 +185,16 @@ export default {
     };
   },
   created() {
-    //如果路由参数存在
-    // if (this.$route.query) {
-    //   this.areaObj = this.$route.query;
-    //   console.log("this.areaObj",this.areaObj)
-    //   this.areaObj.map((v) => {
-    //     const ins = JSON.parse(v.infoNewFile)
-    //     if (ins.length) {
-    //       v.infoFileName = ins[0].infoFileName
-    //       v.infoFileUrl = ins[0].infoFileUrl
-    //     }
-    //   })
-    // }
-    if(this.$route.query.id){
-      this.getDetail(this.$route.query.id)
+    if(this.detailId){
+      this.getDetail(this.detailId)
     }
   },
   methods:{
-
     getDetail(val){
       getDetailByInfoId(val).then(res => {
         this.dataList=res.data
       })
     },
-    goToBasic(pramsData){
-
-      this.$router.push({path:'/business/bid/detail',query:{id:pramsData}});
-    },
-
     handleClose(done) {
       this.$confirm('确认关闭?')
         .then(_ => {
@@ -214,18 +205,8 @@ export default {
     openInfoDetail(){
       this.dialogVisible=true
     },
-    // getDetail(val){
-    //   QueryById(val).then(res =>{
-    //     this.dataList=res.data
-    //   })
-    // },
-    // YMDHMS_daxiao(str1) {
-    //   str1 = new Date(str1).getTime();
-    //   // 小于0则str1时间小,大于0则str1时间大
-    //   return str1 - new Date().getTime();
-    // },
     returnPage(){
-      this.$router.go(-1)
+      this.$emit('change', false);
     },
     getChangeType(e) {
       for (var i = 0; i < this.noticeOneType.length; i++) {

+ 57 - 10
src/views/business/bid/index/biding.vue

@@ -132,7 +132,10 @@
     </el-form>
     <el-table
       :data="dataList.dataTable"
-      style="width: 100%" :header-cell-style="{'text-align':'center'}"  @row-dblclick="handleRouter">
+      style="width: 100%"
+      :height="tableHeight"
+      :header-cell-style="{'text-align':'center'}"
+      @row-dblclick="handleRouter">
       <el-table-column prop="id" label="序号" width="80" align="center"></el-table-column>
       <el-table-column prop="infoTitle" label="标题" width="200" align="center">
 <!--        <template slot-scope="scope">-->
@@ -233,29 +236,67 @@
     <el-pagination
       @size-change="handleSizeChange"
       @current-change="handleCurrentChange"
-      :current-page=form.pageNum
-      :page-size=form.pageSize
+      :current-page=queryParams.pageNum
+      :page-size=queryParams.pageSize
       layout="total, sizes, prev, pager, next, jumper"
       :total=dataList.total
     >
     </el-pagination>
-    <el-dialog :visible.sync="dialogVisible" v-if="dialogVisible" >
 
+    <el-dialog
+      :visible.sync="dialogVisible"
+      v-if="dialogVisible"
+      fullscreen
+      :before-close="handleClose"
+      :modal="false"
+    >
+      <BidingInfoDetail :lastData="this.lastData" @change="costPlannedAmountChange($event)"></BidingInfoDetail>
     </el-dialog>
   </div>
 
 </template>
 <script>
 import {cityQuery, getBidingInfo} from "@/api/business/bid/biding";
-import TemplateList from "@/views/business/spd/target/targetMk/templateDownload.vue";
-
 export default {
-  components: {TemplateList},
-
+  components:{
+    BidingInfoDetail : () => import("@/views/business/bid/detail/bidingInfoDetail.vue"),
+  },
   created() {
+    console.log("this.$route.query.queryParam.pageSize",this.$route.query.queryParam)
+    if(this.$route.query.queryParam!=null){
+      this.queryParams=this.$route.query.queryParam
+      this.btnQuery()
+    }else {
+      this.btnQuery()
+    }
     this.getCity()
+    this.getTableHeight()
+
+  },
+  beforeDestroy() {
+    this.saveQueryParams=this.queryParams
   },
   methods: {
+    async costPlannedAmountChange(value){
+      this.dialogVisible=value
+    },
+    handleClose(done) {
+      this.$confirm('确认关闭?')
+        .then(_ => {
+          done();
+        })
+        .catch(_ => {});
+    },
+    //计算table高度(动态设置table高度)
+    getTableHeight() {
+      let tableH = 120; //距离页面下方的高度
+      let tableHeightDetil = window.innerHeight - tableH;
+      if (tableHeightDetil <= 300) {
+        this.tableHeight = 300;
+      } else {
+        this.tableHeight = window.innerHeight - tableH;
+      }
+    },
     goToBasic(){
       this.$router.push({path:'/business/spd/bo/basic'});
     },
@@ -307,8 +348,8 @@ export default {
       this.btnQuery();
     },
     handleRouter(row,event,colum) {
-      // this.dialogVisible=true
-       let resolve = this.$router.push({path:'/business/bid/bidingInfo',query:{id:row.id}});
+      this.lastData=row.id
+      this.dialogVisible=true
     },
     btnQuery() {
       if (!this.queryParams.releasedTime) {
@@ -355,6 +396,8 @@ export default {
   },
   data() {
     return {
+      lastData:'',
+      tableHeight:'', //表格高度
       dialogVisible:false,
       isShow:false,
       dataList: {
@@ -417,6 +460,10 @@ export default {
           label: '招标预告'
         },
         {
+          value: '3',
+          label: '招标公告'
+        },
+        {
           value: '10',
           label: '候选人公示'
         },

+ 10 - 18
src/views/business/bid/rulesDetail/detail.vue

@@ -31,6 +31,8 @@
               :key="item.userName"
               :label="item.nickName"
               :value="item.userName">
+              <span style="float: left">{{ item.nickName }}</span>
+              <span style="float: right; color: #8492a6; font-size: 13px">{{ item.userName }}</span>
             </el-option>
             </el-select>
           </el-form-item>
@@ -62,7 +64,7 @@
           </el-form-item>
         </el-col>
         <el-col :span="8">
-          <el-form-item label="公告类型">
+          <el-form-item label="公告类型" prop="infoTypeSegment">
             <el-select v-model="form.infoTypeSegment" multiple placeholder="请选择公告类型" style="width: 100%" clearable>
               <el-option
                 v-for="item in noticeType"
@@ -76,7 +78,6 @@
         </el-col>
       </el-row>
       <el-row :gutter="24">
-
 <!--        <el-col :span="8">-->
 <!--          <el-form-item label="获取标书截止日期">-->
 <!--            <el-date-picker-->
@@ -263,6 +264,10 @@ export default {
           label: '招标预告'
         },
         {
+          value: '3',
+          label: '招标公告'
+        },
+        {
           value: '10',
           label: '候选人公示'
         },
@@ -305,22 +310,6 @@ export default {
           label: '电子反拍'
         }
       ],
-      infoTypeSegmentOptions:[{
-        value: '选项1',
-        label: '黄金糕'
-      }, {
-        value: '选项2',
-        label: '双皮奶'
-      }, {
-        value: '选项3',
-        label: '蚵仔煎'
-      }, {
-        value: '选项4',
-        label: '龙须面'
-      }, {
-        value: '选项5',
-        label: '北京烤鸭'
-      }],
       areaObj:'',
       form: {
         id:undefined,
@@ -347,6 +336,9 @@ export default {
         dayNum:30
       },
       rules: {
+        infoTypeSegment: [
+          { required: true, message: '请选择公告类型', trigger: 'change' }
+        ],
         subscriptionRulesName: [
           { required: true, message: '请输入规则名称', trigger: 'blur' }
         ],

+ 28 - 12
src/views/business/bid/subscriptionRules/index.vue

@@ -31,7 +31,10 @@
   </el-form>
     <el-table
       :data="dataList.dataTable"
-      style="padding-top: 10px" :header-cell-style="{'text-align':'center'}">
+      style="margin-top: 10px"
+      :header-cell-style="{'text-align':'center'}"
+      :height="tableHeight"
+    >
       <el-table-column prop="id" label="序号" width="80" align="center"></el-table-column>
       <el-table-column prop="xmNumber" label="项目编号" width="100" align="center"></el-table-column>
       <el-table-column prop="keywordMatch" label="关键字匹配字段" width="120" align="center"></el-table-column>
@@ -66,25 +69,26 @@
         </template>
       </el-table-column>
       <el-table-column  label="操作" width="100" align="center">
-
         <template slot-scope="scope">
           <el-button type="text" @click="handleEdit(scope.row.id)">编辑</el-button>
           <el-button type="text"  @click="handleOpen(scope.row)">
           {{scope.row.stateFalg == '0' ?"停用":"启用"}}
           </el-button>
         </template>
-
       </el-table-column>
     </el-table>
-    <el-pagination
-      @size-change="handleSizeChange"
-      @current-change="handleCurrentChange"
-      :current-page=queryParams.pageNum
-      :page-size=queryParams.pageSize
-      layout="total, sizes, prev, pager, next, jumper"
-      :total=dataList.total
-    >
-    </el-pagination>
+    <el-row>
+      <el-pagination
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+        :current-page=queryParams.pageNum
+        :page-size=queryParams.pageSize
+        layout="total, sizes, prev, pager, next, jumper"
+        :total=dataList.total
+      >
+      </el-pagination>
+    </el-row>
+
   </div>
 </template>
 <script>
@@ -99,8 +103,19 @@ export default {
   },
   created() {
     this.btnQuery();
+    this.getTableHeight()
   },
   methods: {
+    //计算table高度(动态设置table高度)
+    getTableHeight() {
+      let tableH = 100; //距离页面下方的高度
+      let tableHeightDetil = window.innerHeight - tableH;
+      if (tableHeightDetil <= 300) {
+        this.tableHeight = 300;
+      } else {
+        this.tableHeight = window.innerHeight - tableH;
+      }
+    },
     handleEdit(pramsData){
       this.$router.push({path:'/business/bid/subscriptionRulesDetail',query:{id:pramsData}});
     },
@@ -171,6 +186,7 @@ export default {
   },
   data() {
     return {
+      tableHeight:'', //表格高度
       dataList:{
         total: null,
         dataTable: [],

+ 1 - 0
src/views/business/newsLink/index.vue

@@ -15,6 +15,7 @@
         </el-col>
         <el-col :span="3">
           <el-button type="primary" @click="queryBtn">搜索</el-button>
+<!--          <a href="https://www.baidu.com/s?wd=%E5%AE%9A%E4%BA%86%EF%BC%81%E9%80%80%E4%BC%91%E4%BA%BA%E5%91%98%E5%9F%BA%E6%9C%AC%E5%85%BB%E8%80%81%E9%87%91%E4%B8%8A%E8%B0%833%25&tn=25017023_2_dg&ch=8">去查看</a>-->
           <el-button type="primary" @click="pushBtn">一键推送</el-button>
         </el-col>
       </el-row>

+ 707 - 0
src/views/ctyc/info/approval.vue

@@ -0,0 +1,707 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="企业名称" prop="companyName">
+        <el-input
+          v-model="queryParams.companyName"
+          placeholder="请输入企业名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+     <el-form-item label="创建时间" prop="createTimes">
+      <el-date-picker
+        v-model="queryParams.createTimes"
+        type="datetimerange"
+        @keyup.enter.native="handleQuery"
+        range-separator="至"
+        start-placeholder="开始日期"
+        end-placeholder="结束日期">
+      </el-date-picker>
+    </el-form-item>
+      <el-form-item label="监控人员" prop="monitorByName">
+        <el-input
+          v-model="queryParams.monitorByName"
+          placeholder="请输入监控人员名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="infoList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="企业名称" align="center" prop="companyName" />
+      <el-table-column label="新企业名称" align="center" prop="newCompanyName" />
+      <el-table-column label="企业风险预警" align="center" width="300">
+       <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleInfo(scope.row)"
+          >{{scope.row.riskRemark}}</el-button>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" />
+      <el-table-column label="监控人员" align="center" prop="monitorByName" />
+      <el-table-column label="操作" align="center">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleInfo(scope.row)"
+          >待审阅</el-button>
+        </template>
+      </el-table-column> 
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!--修改合作企业对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="企业名称" prop="companyName">
+          <el-input v-model="form.companyName" disabled="true" />
+        </el-form-item>
+        <el-form-item label="监控人员名称" prop="monitorByName">
+          <el-input v-model="form.monitorByName" placeholder="请输入监控人员名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <!--详情对话框 -->
+    <el-dialog :title="infoTitle" :visible.sync="infoOpen" width="70%" append-to-body>
+      <el-form ref="infoForm" :model="infoForm" :rules="infoRules" label-width="20px">
+        <el-form-item label="" prop="">
+          <h2 style="font-weight: bold">{{infoForm.baseinfo.companyName}}</h2>
+        </el-form-item>
+        <el-form-item label="" prop="" class="spaced-items">
+           <el-button type="success" size="mini">{{infoForm.baseinfo.regStatus}}</el-button> 
+           <el-button type="info" size="mini">{{infoForm.baseinfo.historyNames}}</el-button>
+           <el-button type="primary" size="mini">{{infoForm.baseinfo.industry}}</el-button> 
+           <el-button type="danger" size="mini">{{infoForm.companyInfo.riskRemark}}</el-button> 
+           <el-button  size="mini">{{infoForm.companyInfo.updateTime}}</el-button> 
+        </el-form-item>
+        <el-form-item label="" prop="">
+         <hr class="shr">
+        </el-form-item>
+        <el-form-item label="" prop="">
+          <el-col :span="8">
+            <span>统一社会信用代码:{{infoForm.baseinfo.creditCode}}</span>
+          </el-col>
+          <el-col :span="8">
+            <span>电话:{{infoForm.baseinfo.phoneNumber}}</span>
+          </el-col>
+          <el-col :span="8">
+            <span>国际行业:{{infoForm.baseinfo.industry}}</span>
+          </el-col>
+        </el-form-item>
+        <el-form-item label="" prop="" class="spaced-items">
+          <el-col :span="8">
+            <span>法定代表人:<span style="color:blue">{{infoForm.baseinfo.legalPersonName}}</span></span>
+          </el-col>
+          <el-col :span="8">
+            <span>邮箱:<span style="color:blue">{{infoForm.baseinfo.email}}</span></span>
+          </el-col>
+          <el-col :span="8">
+            <span>企业规模:{{infoForm.baseinfo.staffNumRange}}</span>
+          </el-col>
+        </el-form-item>
+        <el-form-item label="" prop="" class="spaced-items">
+          <el-col :span="8">
+            <span>注册资本:{{infoForm.baseinfo.regCapital}}</span>
+          </el-col>
+          <el-col :span="8">
+            <span>网址:<span style="color:blue">{{infoForm.baseinfo.websiteList}}</a></span></span>
+          </el-col>
+          <el-col :span="8">
+            <span>员工人数:{{infoForm.baseinfo.socialStaffNum}}</span>
+          </el-col>
+        </el-form-item>
+        <el-form-item label="" prop="" class="spaced-items">
+          <el-col :span="8">
+            <span>成立日期:{{infoForm.baseinfo.estiblishTime}}</span>
+          </el-col>
+          <el-col :span="16">
+            <span>地址:{{infoForm.baseinfo.regLocation}}</span>
+          </el-col>
+        </el-form-item>
+        <el-form-item label="" prop="" class="spaced-items">
+          <div>经营范围:<br/>{{infoForm.baseinfo.businessScope}}</div>
+        </el-form-item>
+        <el-form-item label="" prop="">
+         <hr class="shr">
+        </el-form-item>
+        <el-form-item label="" prop="">
+          <el-col :span="20">
+            <el-button @click="bt1()" type="primary" :plain="bp1">企业信息变更({{infoForm.companyInfo.staffNum + infoForm.companyInfo.inverstNum + infoForm.companyInfo.changeinfoNum}}+ {{infoForm.companyInfo.staffAdd + infoForm.companyInfo.inverstAdd + infoForm.companyInfo.changeinfoAdd}})</el-button> 
+            <el-button @click="bt2()" type="primary" :plain="bp2">法律诉讼({{infoForm.companyInfo.courtRegisterNum + infoForm.companyInfo.dishonestNum}}+{{infoForm.companyInfo.courtRegisterAdd + infoForm.companyInfo.dishonestAdd}})</el-button>
+          </el-col>
+          <el-col :span="4">
+            <el-button type="warning" @click="handleAlog()">风险审阅</el-button> <br/> <span style="margin-left:20px" @click="handleAlogInfo()">审阅记录  </span>
+          </el-col>
+        </el-form-item>
+        <el-form-item label="" prop="" v-if="ef1">
+          <h4>主要人员 {{infoForm.companyInfo.staffNum?infoForm.companyInfo.staffNum:0}} <span style="color:orange">(近期新增 {{infoForm.companyInfo.staffAdd?infoForm.companyInfo.staffAdd:0}})</span></h4>
+        </el-form-item>
+        <el-form-item label="" prop="" v-if="ef1">
+                      <el-table
+                  :data="infoForm.staffs"
+                  style="width: 100%">
+                  <el-table-column
+                    type="index"
+                    width="50">
+                  </el-table-column>
+                  <el-table-column
+                    prop="name"
+                    label="姓名"
+                    width="180">
+                  </el-table-column>
+                  <el-table-column
+                    prop="typeJoin"
+                    label="职位">
+                  </el-table-column>
+                </el-table>
+        </el-form-item>
+
+        <el-form-item label="" prop="" v-if="ef1">
+          <h4>对外投资 {{infoForm.companyInfo.inverstNum?infoForm.companyInfo.inverstNum:0}} <span style="color:orange">(近期新增 {{infoForm.companyInfo.inverstAdd?infoForm.companyInfo.inverstAdd:0}})</span></h4>
+        </el-form-item>
+        <el-form-item label="" prop="" v-if="ef1">
+                      <el-table
+                  :data="infoForm.inversts"
+                  style="width: 100%">
+                  <el-table-column
+                    type="index"
+                    width="50">
+                  </el-table-column>
+                  <el-table-column
+                    prop="investedName"
+                    label="被投资企业名称"
+                    width="180">
+                  </el-table-column>
+                  <el-table-column
+                    prop="legalPersonName"
+                    label="被投资法定代表人">
+                  </el-table-column>
+                  <el-table-column
+                    prop="percent"
+                    label="投资占比">
+                  </el-table-column>
+                  <el-table-column
+                    prop="regCapital"
+                    label="注册资本">
+                  </el-table-column>
+                  <el-table-column
+                    prop="estiblishTime"
+                    label="成立日期">
+                  </el-table-column>
+                  <el-table-column
+                    prop="regStatus"
+                    label="经营状态">
+                  </el-table-column>
+                </el-table>
+        </el-form-item>
+        
+        <el-form-item label="" prop="" v-if="ef1">
+          <h4>变更记录 {{infoForm.companyInfo.changeinfoNum?infoForm.companyInfo.changeinfoNum:0}} <span style="color:orange">(近期新增 {{infoForm.companyInfo.changeinfoAdd?infoForm.companyInfo.changeinfoAdd:0}})</span></h4>
+        </el-form-item>
+        <el-form-item label="" prop="" v-if="ef1">
+                      <el-table
+                  :data="infoForm.changeinfos"
+                  style="width: 100%">
+                  <el-table-column
+                    type="index"
+                    width="50">
+                  </el-table-column>
+                  <el-table-column
+                    prop="changeTime"
+                    label="变更日期"
+                    width="180">
+                  </el-table-column>
+                  <el-table-column
+                    prop="changeItem"
+                    label="变更项目">
+                  </el-table-column>
+                  <el-table-column
+                    prop="contentBefore"
+                    label="变更前">
+                  </el-table-column>
+                  <el-table-column
+                    prop="contentAfter"
+                    label="变更后">
+                  </el-table-column>
+                </el-table>
+        </el-form-item>
+
+      <el-form-item label="" prop="" v-if="ef2">
+          <h4>立案信息 {{infoForm.companyInfo.courtRegisterNum?infoForm.companyInfo.courtRegisterNum:0}} <span style="color:orange">(近期新增 {{infoForm.companyInfo.courtRegisterAdd?infoForm.companyInfo.courtRegisterAdd:0}})</span></h4>
+        </el-form-item>
+        <el-form-item label="" prop="" v-if=ef2>
+                      <el-table
+                  :data="infoForm.courtRegisters"
+                  style="width: 100%">
+                  <el-table-column
+                    type="index"
+                    width="50">
+                  </el-table-column>
+                  <el-table-column
+                    prop="filingDate"
+                    label="立案日期">
+                  </el-table-column>
+                  <el-table-column
+                    prop="caseNo"
+                    label="案号">
+                  </el-table-column>
+                  <el-table-column
+                    prop="caseReason"
+                    label="案由">
+                  </el-table-column>
+                  <el-table-column
+                    prop="plaintiff"
+                    label="公诉人/原告/上诉人/申请人">
+                  </el-table-column>
+                  <el-table-column
+                    prop="defendant"
+                    label="被告人/被告/被上诉人/被申请人">
+                  </el-table-column>
+                </el-table>
+        </el-form-item>
+
+     <el-form-item label="" prop="" v-if="ef2">
+          <h4>失信被执行人 {{infoForm.companyInfo.dishonestNum?infoForm.companyInfo.dishonestNum:0}} <span style="color:orange">(近期新增 {{infoForm.companyInfo.dishonestAdd?infoForm.companyInfo.dishonestAdd:0}})</span></h4>
+        </el-form-item>
+        <el-form-item label="" prop="" v-if=ef2>
+                      <el-table
+                  :data="infoForm.dishonests"
+                  style="width: 100%">
+                  <el-table-column
+                    type="index"
+                    width="50">
+                  </el-table-column>
+                  <el-table-column
+                    prop="publishdate"
+                    label="发布日期"
+                    width="180">
+                  </el-table-column>
+                  <el-table-column
+                    prop="regdate"
+                    label="立案日期">
+                  </el-table-column>
+                  <el-table-column
+                    prop="casecode"
+                    label="案号">
+                  </el-table-column>
+                  <el-table-column
+                    prop="courtname"
+                    label="执行法院">
+                  </el-table-column>
+                  <el-table-column
+                    prop="performance"
+                    label="履行情况">
+                  </el-table-column>
+                  <el-table-column
+                    prop="gistid"
+                    label="执行依据文号">
+                  </el-table-column>
+                </el-table>
+        </el-form-item>
+      </el-form>
+    </el-dialog>
+
+    <!--新增审阅记录对话框 -->
+    <el-dialog :title="alogTitle" :visible.sync="alogOpen" width="500px" append-to-body>
+      <el-form ref="alogForm" :model="alogForm" :rules="alogRules" label-width="80px">
+        <el-form-item label="审阅等级" prop="approvalLevel">
+          <el-select
+                clearable
+                @change="$forceUpdate()"
+                v-model="alogForm.approvalLevel"
+                :size="size"
+                style="width: 200px"
+              >
+                <el-option
+                  v-for="level in levels"
+                  :key="level.value"
+                  :label="level.label"
+                  :value="level.value"
+                >
+                </el-option>
+              </el-select>
+        </el-form-item>
+        <el-form-item label="审阅意见" prop="approvalRemark">
+          <el-input v-model="alogForm.approvalRemark" placeholder="请输入审阅意见" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="alogSubmitForm">提交审阅</el-button>
+        <el-button @click="alogCancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <!--审阅记录对话框 -->
+    <el-dialog :title="alogInfoTitle" :visible.sync="alogInfoOpen" width="70%" append-to-body>
+      <el-form ref="alogInfoForm" :model="alogInfoForm" :rules="alogInfoRules" label-width="20px">
+        <el-form-item label="" prop="">
+                      <el-table
+                  :data="alogInfoForm"
+                  style="width: 100%">
+                  <el-table-column
+                    type="index"
+                    width="50">
+                  </el-table-column>
+                  <el-table-column
+                    prop="approvalLevel"
+                    label="人工审阅等级"
+                    >
+                  </el-table-column>
+                  <el-table-column
+                    prop="approvalRemark"
+                    label="审阅意见"
+                    >
+                  </el-table-column>
+                  <el-table-column
+                    prop="approvalByName"
+                    label="审阅人"
+                    >
+                  </el-table-column>
+                  <el-table-column
+                    prop="approvalTime"
+                    label="审阅时间"
+                    >
+                  </el-table-column>
+                </el-table>
+        </el-form-item>
+      </el-form>
+    </el-dialog>
+  </div>
+</template>
+
+<style>
+
+.spaced-items {
+  margin-top: -30px; /* 调整间隔为20px */
+}
+.shr {
+  border: none; /* 移除默认边框 */
+    height: 1px; /* 设置高度 */
+    background-color: #333; /* 设置颜色 */
+    margin: 10px 0; /* 设置上下外边距 */
+}
+</style>
+
+<script>
+import { listInfo, getInfo, delInfo, addInfo, updateInfo, getTycInfo, addAlog, query } from "@/api/ctyc/info";
+
+export default {
+  name: "Info",
+  data() {
+    return {
+      // 按钮模拟默认点击
+      bp1: false,
+      bp2: true,
+      // 详情弹出层标题
+      alogInfoTitle: "",
+      // 详情是否显示弹出层
+      alogInfoOpen: false,
+      // 详情表单参数
+      alogInfoForm: {
+      },
+      // 详情表单校验
+      alogInfoRules: {},
+      // 风险等级
+      levels: [{
+          value: '',
+          label: '请选择'
+        }, {
+          value: '风险A:风险较低,不影响继续合作',
+          label: '风险A:风险较低,不影响继续合作'
+        }, {
+          value: '风险B:风险一般,建议人工了解',
+          label: '风险B:风险一般,建议人工了解'
+        }, {
+          value: '风险C:风险较高,可能影响合作',
+          label: '风险C:风险较高,可能影响合作'
+        }],
+      // 详情弹出层标题
+      alogTitle: "",
+      // 详情是否显示弹出层
+      alogOpen: false,
+      // 详情表单参数
+      alogForm: {
+      },
+      // 详情表单校验
+      alogRules: {},
+      // 控制隐藏
+      ef1: true,
+      ef2: false,
+      // 详情弹出层标题
+      infoTitle: "",
+      // 详情是否显示弹出层
+      infoOpen: false,
+      // 详情表单参数
+      infoForm: {
+        baseinfo: {},
+        companyInfo: {}
+      },
+      // 详情表单校验
+      infoRules: {},
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 合作企业表格数据
+      infoList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        companyId: null,
+        companyName: null,
+        newCompanyName: null,
+        monitorBy: null,
+        monitorByName: null,
+        revision: null,
+        tenantId: null,
+        approvalLevel: null,
+        approvalRemark: null,
+        approvalBy: null,
+        approvalByName: null,
+        approvalTime: null,
+        status: 0,
+        createTimes: '',
+        createTimeStart: '',
+        createTimeEnd: ''
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询合作企业列表 */
+    getList() {
+      this.loading = true;
+      if(this.queryParams.createTimes != null && this.queryParams.createTimes != ''){
+        this.queryParams.createTimeStart = new Date(this.queryParams.createTimes[0]).toLocaleString();
+        this.queryParams.createTimeEnd = new Date(this.queryParams.createTimes[1]).toLocaleString();
+      }
+      listInfo(this.queryParams).then(response => {
+        this.infoList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+        this.queryParams.createTimeStart = '';
+        this.queryParams.createTimeEnd = '';
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 风险审阅取消按钮
+    alogCancel(){
+        this.alogOpen = false;
+        this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        companyId: null,
+        companyName: null,
+        newCompanyName: null,
+        monitorBy: null,
+        monitorByName: null,
+        revision: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        delFlag: null,
+        tenantId: null,
+        approvalLevel: null,
+        approvalRemark: null,
+        approvalBy: null,
+        approvalByName: null,
+        approvalTime: null,
+        status: 0,
+        createTimes: '',
+        createTimeStart: '',
+        createTimeEnd: ''
+      };
+      this.resetForm("form");
+      this.alogForm = {
+      };
+      this.resetForm("alogForm");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加合作企业";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getInfo(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改合作企业";
+      });
+    },
+    /** 详情按钮操作 */
+    handleInfo(row) {
+      this.reset();
+      const companyId = row.companyId
+      getTycInfo(companyId).then(response => {
+        this.infoForm = response.data;
+        this.infoOpen = true;
+        this.ef1 = true;
+        this.ef2 = false;
+        this.bp1 = false;
+        this.bp2 = true;
+        this.infoTitle = "审阅";
+      })
+    },
+    /** 风险审阅按钮操作 */
+    handleAlog() {
+      this.reset();
+      this.alogOpen = true;
+      this.alogForm.approvalLevel = ''
+    },
+    /** 审阅记录按钮操作 */
+    handleAlogInfo() {
+      this.reset();
+      query(this.infoForm.companyInfo.companyId).then(response => {
+        this.alogInfoForm = response.rows;
+        this.alogInfoOpen = true;
+        this.alogInfoTitle = "审阅记录";
+      })
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateInfo(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addInfo(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 风险审阅提交按钮 */
+    alogSubmitForm() {
+      this.$refs["alogForm"].validate(valid => {
+        if (valid) {
+          if(this.alogForm.approvalLevel!=null && this.alogForm.approvalLevel!='' &&
+          this.infoForm.companyInfo.companyId != null && this.infoForm.companyInfo.companyId != ''){
+            this.alogForm.companyId = this.infoForm.companyInfo.companyId;
+            this.alogForm.companyName = this.infoForm.companyInfo.companyName;
+              addAlog(this.alogForm).then(response => {
+                this.$modal.msgSuccess("审阅提交成功");
+                this.alogOpen = false;
+                this.getList();
+              });
+          }else{
+              this.$message.error('请选择审阅等级!');
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除合作企业编号为"' + ids + '"的数据项?').then(function() {
+        return delInfo(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('ctyc/info/export', {
+        ...this.queryParams
+      }, `info_${new Date().getTime()}.xlsx`)
+    },
+    /** 按钮事件控制隐藏 */
+    bt1(){
+      this.ef2 = false;
+      this.ef1 = true;
+      this.bp1 = false;
+      this.bp2 = true;
+    },
+    bt2(){
+      this.ef1 = false;
+      this.ef2 = true;
+      this.bp1 = true;
+      this.bp2 = false;
+    }
+  }
+};
+</script>
+

+ 53 - 0
src/views/ctyc/info/approvalMain.vue

@@ -0,0 +1,53 @@
+<template>
+  <div class="app-container">
+    <el-tabs v-model="activeName" >
+      <el-tab-pane :label="num1" name="approval"></el-tab-pane>
+      <el-tab-pane :label="num2" name="approved"></el-tab-pane>
+    </el-tabs>
+    <component :is="currentPage"></component>
+  </div>
+</template>
+
+<script>
+import { listInfo } from "@/api/ctyc/info";
+import approval from '@/views/ctyc/info/approval';
+import approved from '@/views/ctyc/info/approved';
+export default {
+  name: "tabs",
+  data() {
+    return {
+      num1: '',
+      num2: '',
+      queryParams1: {
+        status: 0,
+      },
+      queryParams2: {
+        status: 1,
+      },
+      activeName: 'approval' // 默认激活第一个标签
+    };
+  },
+  created() {
+    listInfo(this.queryParams1).then(response => {
+      // 
+      this.num1 = "待审阅 ("+response.total+")";
+    });
+    listInfo(this.queryParams2).then(response => {
+      this.num2 = "已审阅 ("+response.total+")";
+    });
+  },
+  methods: {
+    
+  },
+  components:{
+    approval,
+    approved
+  },
+  computed: {
+    // 计算属性返回当前应该显示的组件
+    currentPage() {
+      return this.activeName;
+    }
+  }
+};
+</script>

+ 742 - 0
src/views/ctyc/info/approved.vue

@@ -0,0 +1,742 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="企业名称" prop="companyName">
+        <el-input
+          v-model="queryParams.companyName"
+          placeholder="请输入企业名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+     <el-form-item label="审阅时间" prop="approvalTimes">
+      <el-date-picker
+        v-model="queryParams.approvalTimes"
+        type="datetimerange"
+        @keyup.enter.native="handleQuery"
+        range-separator="至"
+        start-placeholder="开始日期"
+        end-placeholder="结束日期">
+      </el-date-picker>
+    </el-form-item>
+      <el-form-item label="监控人员" prop="monitorByName">
+        <el-input
+          v-model="queryParams.monitorByName"
+          placeholder="请输入监控人员名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+
+      <el-form-item label="风险等级" prop="approvalLevel">
+        <el-select
+                clearable
+                v-model="queryParams.approvalLevel"
+                :size="size"
+                style="width: 200px"
+              >
+                <el-option
+                  v-for="level in levelTaps"
+                  :key="level.value"
+                  :label="level.label"
+                  :value="level.value"
+                >
+                </el-option>
+              </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <h4><span>   备注: 风险A:风险较低,不影响继续合作; 风险B:风险一般,建议人工了解; 风险C:风险较高,可能影响合作。</span></h4>
+
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="infoList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="企业名称" align="center" prop="companyName" />
+      <el-table-column label="新企业名称" align="center" prop="newCompanyName" />
+      <el-table-column label="企业风险预警" align="center" width="300">
+       <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleInfo(scope.row)"
+          >{{scope.row.riskRemark}}</el-button>
+        </template>
+      </el-table-column>
+      <el-table-column label="人工审阅等级" align="center" prop="approvalLevel" />
+      <el-table-column label="审阅意见" align="center" prop="approvalRemark" />
+      <el-table-column label="审阅人" align="center" prop="approvalByName" />
+      <el-table-column label="审阅时间" align="center" prop="approvalTime" />
+      <el-table-column label="操作" align="center" >
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleInfo(scope.row)"
+          >已审阅</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!--修改合作企业对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="企业名称" prop="companyName">
+          <el-input v-model="form.companyName" disabled="true" />
+        </el-form-item>
+        <el-form-item label="监控人员名称" prop="monitorByName">
+          <el-input v-model="form.monitorByName" placeholder="请输入监控人员名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <!--详情对话框 -->
+    <el-dialog :title="infoTitle" :visible.sync="infoOpen" width="70%" append-to-body>
+      <el-form ref="infoForm" :model="infoForm" :rules="infoRules" label-width="20px">
+        <el-form-item label="" prop="">
+          <h2 style="font-weight: bold">{{infoForm.baseinfo.companyName}}</h2>
+        </el-form-item>
+        <el-form-item label="" prop="" class="spaced-items">
+           <el-button type="success" size="mini">{{infoForm.baseinfo.regStatus}}</el-button> 
+           <el-button type="info" size="mini">{{infoForm.baseinfo.historyNames}}</el-button>
+           <el-button type="primary" size="mini">{{infoForm.baseinfo.industry}}</el-button> 
+           <el-button type="danger" size="mini">{{infoForm.companyInfo.riskRemark}}</el-button> 
+           <el-button  size="mini">{{infoForm.companyInfo.updateTime}}</el-button> 
+        </el-form-item>
+        <el-form-item label="" prop="">
+         <hr class="shr">
+        </el-form-item>
+        <el-form-item label="" prop="">
+          <el-col :span="8">
+            <span>统一社会信用代码:{{infoForm.baseinfo.creditCode}}</span>
+          </el-col>
+          <el-col :span="8">
+            <span>电话:{{infoForm.baseinfo.phoneNumber}}</span>
+          </el-col>
+          <el-col :span="8">
+            <span>国际行业:{{infoForm.baseinfo.industry}}</span>
+          </el-col>
+        </el-form-item>
+        <el-form-item label="" prop="" class="spaced-items">
+          <el-col :span="8">
+            <span>法定代表人:<span style="color:blue">{{infoForm.baseinfo.legalPersonName}}</span></span>
+          </el-col>
+          <el-col :span="8">
+            <span>邮箱:<span style="color:blue">{{infoForm.baseinfo.email}}</span></span>
+          </el-col>
+          <el-col :span="8">
+            <span>企业规模:{{infoForm.baseinfo.staffNumRange}}</span>
+          </el-col>
+        </el-form-item>
+        <el-form-item label="" prop="" class="spaced-items">
+          <el-col :span="8">
+            <span>注册资本:{{infoForm.baseinfo.regCapital}}</span>
+          </el-col>
+          <el-col :span="8">
+            <span>网址:<span style="color:blue">{{infoForm.baseinfo.websiteList}}</a></span></span>
+          </el-col>
+          <el-col :span="8">
+            <span>员工人数:{{infoForm.baseinfo.socialStaffNum}}</span>
+          </el-col>
+        </el-form-item>
+        <el-form-item label="" prop="" class="spaced-items">
+          <el-col :span="8">
+            <span>成立日期:{{infoForm.baseinfo.estiblishTime}}</span>
+          </el-col>
+          <el-col :span="16">
+            <span>地址:{{infoForm.baseinfo.regLocation}}</span>
+          </el-col>
+        </el-form-item>
+        <el-form-item label="" prop="" class="spaced-items">
+          <div>经营范围:<br/>{{infoForm.baseinfo.businessScope}}</div>
+        </el-form-item>
+        <el-form-item label="" prop="">
+         <hr class="shr">
+        </el-form-item>
+        <el-form-item label="" prop=""> 
+          <el-col :span="20">
+            <el-button @click="bt1()" type="primary" :plain="bp1">企业信息变更({{infoForm.companyInfo.staffNum + infoForm.companyInfo.inverstNum + infoForm.companyInfo.changeinfoNum}}+ {{infoForm.companyInfo.staffAdd + infoForm.companyInfo.inverstAdd + infoForm.companyInfo.changeinfoAdd}})</el-button> 
+            <el-button @click="bt2()" type="primary" :plain="bp2">法律诉讼({{infoForm.companyInfo.courtRegisterNum + infoForm.companyInfo.dishonestNum}}+{{infoForm.companyInfo.courtRegisterAdd + infoForm.companyInfo.dishonestAdd}})</el-button>
+          </el-col>
+          <el-col :span="4">
+            <el-button type="warning" @click="handleAlog()">风险审阅</el-button> <br/> <span style="margin-left:20px" @click="handleAlogInfo()">审阅记录  </span>
+          </el-col>
+        </el-form-item>
+        <el-form-item label="" prop="" v-if="ef1">
+          <h4>主要人员 {{infoForm.companyInfo.staffNum?infoForm.companyInfo.staffNum:0}} <span style="color:orange">(近期新增 {{infoForm.companyInfo.staffAdd?infoForm.companyInfo.staffAdd:0}})</span></h4>
+        </el-form-item>
+        <el-form-item label="" prop="" v-if="ef1">
+                      <el-table
+                  :data="infoForm.staffs"
+                  style="width: 100%">
+                  <el-table-column
+                    type="index"
+                    width="50">
+                  </el-table-column>
+                  <el-table-column
+                    prop="name"
+                    label="姓名"
+                    width="180">
+                  </el-table-column>
+                  <el-table-column
+                    prop="typeJoin"
+                    label="职位">
+                  </el-table-column>
+                </el-table>
+        </el-form-item>
+
+        <el-form-item label="" prop="" v-if="ef1">
+          <h4>对外投资 {{infoForm.companyInfo.inverstNum?infoForm.companyInfo.inverstNum:0}} <span style="color:orange">(近期新增 {{infoForm.companyInfo.inverstAdd?infoForm.companyInfo.inverstAdd:0}})</span></h4>
+        </el-form-item>
+        <el-form-item label="" prop="" v-if="ef1">
+                      <el-table
+                  :data="infoForm.inversts"
+                  style="width: 100%">
+                  <el-table-column
+                    type="index"
+                    width="50">
+                  </el-table-column>
+                  <el-table-column
+                    prop="name"
+                    label="被投资企业名称"
+                    width="180">
+                  </el-table-column>
+                  <el-table-column
+                    prop="legalPersonName"
+                    label="被投资法定代表人">
+                  </el-table-column>
+                  <el-table-column
+                    prop="percent"
+                    label="投资占比">
+                  </el-table-column>
+                  <el-table-column
+                    prop="regCapital"
+                    label="注册资本">
+                  </el-table-column>
+                  <el-table-column
+                    prop="estiblishTime"
+                    label="成立日期">
+                  </el-table-column>
+                  <el-table-column
+                    prop="regStatus"
+                    label="经营状态">
+                  </el-table-column>
+                </el-table>
+        </el-form-item>
+        
+        <el-form-item label="" prop="" v-if="ef1">
+          <h4>变更记录 {{infoForm.companyInfo.changeinfoNum?infoForm.companyInfo.changeinfoNum:0}} <span style="color:orange">(近期新增 {{infoForm.companyInfo.changeinfoAdd?infoForm.companyInfo.changeinfoAdd:0}})</span></h4>
+        </el-form-item>
+        <el-form-item label="" prop="" v-if="ef1">
+                      <el-table
+                  :data="infoForm.changeinfos"
+                  style="width: 100%">
+                  <el-table-column
+                    type="index"
+                    width="50">
+                  </el-table-column>
+                  <el-table-column
+                    prop="changeTime"
+                    label="变更日期"
+                    width="180">
+                  </el-table-column>
+                  <el-table-column
+                    prop="changeItem"
+                    label="变更项目">
+                  </el-table-column>
+                  <el-table-column
+                    prop="contentBefore"
+                    label="变更前">
+                  </el-table-column>
+                  <el-table-column
+                    prop="contentAfter"
+                    label="变更后">
+                  </el-table-column>
+                </el-table>
+        </el-form-item>
+
+      <el-form-item label="" prop="" v-if="ef2">
+          <h4>立案信息 {{infoForm.companyInfo.courtRegisterNum?infoForm.companyInfo.courtRegisterNum:0}} <span style="color:orange">(近期新增 {{infoForm.companyInfo.courtRegisterAdd?infoForm.companyInfo.courtRegisterAdd:0}})</span></h4>
+        </el-form-item>
+        <el-form-item label="" prop="" v-if=ef2>
+                      <el-table
+                  :data="infoForm.courtRegisters"
+                  style="width: 100%">
+                  <el-table-column
+                    type="index"
+                    width="50">
+                  </el-table-column>
+                  <el-table-column
+                    prop="filingDate"
+                    label="立案日期">
+                  </el-table-column>
+                  <el-table-column
+                    prop="caseNo"
+                    label="案号">
+                  </el-table-column>
+                  <el-table-column
+                    prop="caseReason"
+                    label="案由">
+                  </el-table-column>
+                  <el-table-column
+                    prop="plaintiff"
+                    label="公诉人/原告/上诉人/申请人">
+                  </el-table-column>
+                  <el-table-column
+                    prop="defendant"
+                    label="被告人/被告/被上诉人/被申请人">
+                  </el-table-column>
+                </el-table>
+        </el-form-item>
+
+     <el-form-item label="" prop="" v-if="ef2">
+          <h4>失信被执行人 {{infoForm.companyInfo.dishonestNum?infoForm.companyInfo.dishonestNum:0}} <span style="color:orange">(近期新增 {{infoForm.companyInfo.dishonestAdd?infoForm.companyInfo.dishonestAdd:0}})</span></h4>
+        </el-form-item>
+        <el-form-item label="" prop="" v-if=ef2>
+                      <el-table
+                  :data="infoForm.dishonests"
+                  style="width: 100%">
+                  <el-table-column
+                    type="index"
+                    width="50">
+                  </el-table-column>
+                  <el-table-column
+                    prop="publishdate"
+                    label="发布日期"
+                    width="180">
+                  </el-table-column>
+                  <el-table-column
+                    prop="regdate"
+                    label="立案日期">
+                  </el-table-column>
+                  <el-table-column
+                    prop="casecode"
+                    label="案号">
+                  </el-table-column>
+                  <el-table-column
+                    prop="courtname"
+                    label="执行法院">
+                  </el-table-column>
+                  <el-table-column
+                    prop="performance"
+                    label="履行情况">
+                  </el-table-column>
+                  <el-table-column
+                    prop="gistid"
+                    label="执行依据文号">
+                  </el-table-column>
+                </el-table>
+        </el-form-item>
+      </el-form>
+    </el-dialog>
+
+    <!--新增审阅记录对话框 -->
+    <el-dialog :title="alogTitle" :visible.sync="alogOpen" width="500px" append-to-body>
+      <el-form ref="alogForm" :model="alogForm" :rules="alogRules" label-width="80px">
+        <el-form-item label="审阅等级" prop="approvalLevel">
+          <el-select
+                clearable
+                @change="$forceUpdate()"
+                v-model="alogForm.approvalLevel"
+                :size="size"
+                style="width: 200px"
+              >
+                <el-option
+                  v-for="level in levels"
+                  :key="level.value"
+                  :label="level.label"
+                  :value="level.value"
+                >
+                </el-option>
+              </el-select>
+        </el-form-item>
+        <el-form-item label="审阅意见" prop="approvalRemark">
+          <el-input v-model="alogForm.approvalRemark" placeholder="请输入审阅意见" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="alogSubmitForm">提交审阅</el-button>
+        <el-button @click="alogCancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <!--审阅记录对话框 -->
+    <el-dialog :title="alogInfoTitle" :visible.sync="alogInfoOpen" width="70%" append-to-body>
+      <el-form ref="alogInfoForm" :model="alogInfoForm" :rules="alogInfoRules" label-width="20px">
+        <el-form-item label="" prop="">
+                      <el-table
+                  :data="alogInfoForm"
+                  style="width: 100%">
+                  <el-table-column
+                    type="index"
+                    width="50">
+                  </el-table-column>
+                  <el-table-column
+                    prop="approvalLevel"
+                    label="人工审阅等级"
+                    >
+                  </el-table-column>
+                  <el-table-column
+                    prop="approvalRemark"
+                    label="审阅意见"
+                    >
+                  </el-table-column>
+                  <el-table-column
+                    prop="approvalByName"
+                    label="审阅人"
+                    >
+                  </el-table-column>
+                  <el-table-column
+                    prop="approvalTime"
+                    label="审阅时间"
+                    >
+                  </el-table-column>
+                </el-table>
+        </el-form-item>
+      </el-form>
+    </el-dialog>
+  </div>
+</template>
+
+<style>
+
+.spaced-items {
+  margin-top: -30px; /* 调整间隔为20px */
+}
+.shr {
+  border: none; /* 移除默认边框 */
+    height: 1px; /* 设置高度 */
+    background-color: #333; /* 设置颜色 */
+    margin: 10px 0; /* 设置上下外边距 */
+}
+</style>
+
+<script>
+import { listInfo, getInfo, delInfo, addInfo, updateInfo, getTycInfo, addAlog, query } from "@/api/ctyc/info";
+
+export default {
+  name: "Info",
+  data() {
+    return {
+      // 按钮模拟默认点击
+      bp1: false,
+      bp2: true,
+      // 风险等级
+      levelTaps: [{
+          value: '',
+          label: '全部'
+        }, {
+          value: 'A',
+          label: 'A'
+        }, {
+          value: 'B',
+          label: 'B'
+        }, {
+          value: 'C',
+          label: 'C'
+        }],
+      // 详情弹出层标题
+      alogInfoTitle: "",
+      // 详情是否显示弹出层
+      alogInfoOpen: false,
+      // 详情表单参数
+      alogInfoForm: {
+      },
+      // 详情表单校验
+      alogInfoRules: {},
+      // 风险等级
+      levels: [{
+          value: '',
+          label: '请选择'
+        }, {
+          value: '风险A:风险较低,不影响继续合作',
+          label: '风险A:风险较低,不影响继续合作'
+        }, {
+          value: '风险B:风险一般,建议人工了解',
+          label: '风险B:风险一般,建议人工了解'
+        }, {
+          value: '风险C:风险较高,可能影响合作',
+          label: '风险C:风险较高,可能影响合作'
+        }],
+      // 详情弹出层标题
+      alogTitle: "",
+      // 详情是否显示弹出层
+      alogOpen: false,
+      // 详情表单参数
+      alogForm: {
+      },
+      // 详情表单校验
+      alogRules: {},
+      // 控制隐藏
+      ef1: true,
+      ef2: false,
+      // 详情弹出层标题
+      infoTitle: "",
+      // 详情是否显示弹出层
+      infoOpen: false,
+      // 详情表单参数
+      infoForm: {
+        baseinfo: {},
+        companyInfo: {}
+      },
+      // 详情表单校验
+      infoRules: {},
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 合作企业表格数据
+      infoList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        companyId: null,
+        companyName: null,
+        newCompanyName: null,
+        monitorBy: null,
+        monitorByName: null,
+        revision: null,
+        tenantId: null,
+        approvalLevel: null,
+        approvalRemark: null,
+        approvalBy: null,
+        approvalByName: null,
+        approvalTime: null,
+        status: 1,
+        approvalTimes: '',
+        approvalTimeStart: '',
+        approvalTimeEnd: ''
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询合作企业列表 */
+    getList() {
+      this.loading = true;
+      if(this.queryParams.approvalTimes != null && this.queryParams.approvalTimes != ''){
+        this.queryParams.approvalTimeStart = new Date(this.queryParams.approvalTimes[0]).toLocaleString();
+        this.queryParams.approvalTimeEnd = new Date(this.queryParams.approvalTimes[1]).toLocaleString();
+      }
+      listInfo(this.queryParams).then(response => {
+        this.infoList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+        this.queryParams.approvalTimeStart = '';
+        this.queryParams.approvalTimeEnd = '';
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 风险审阅取消按钮
+    alogCancel(){
+        this.alogOpen = false;
+        this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        companyId: null,
+        companyName: null,
+        newCompanyName: null,
+        monitorBy: null,
+        monitorByName: null,
+        revision: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        delFlag: null,
+        tenantId: null,
+        approvalLevel: null,
+        approvalRemark: null,
+        approvalBy: null,
+        approvalByName: null,
+        approvalTime: null,
+        status: 1,
+        approvalTimes: '',
+        approvalTimeStart: '',
+        approvalTimeEnd: ''
+      };
+      this.resetForm("form");
+      this.alogForm = {
+      };
+      this.resetForm("alogForm");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加合作企业";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getInfo(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改合作企业";
+      });
+    },
+    /** 详情按钮操作 */
+    handleInfo(row) {
+      this.reset();
+      const companyId = row.companyId
+      getTycInfo(companyId).then(response => {
+        this.infoForm = response.data;
+        this.infoOpen = true;
+        this.ef1 = true;
+        this.ef2 = false;
+        this.bp1 = false;
+        this.bp2 = true;
+        this.infoTitle = "审阅";
+      })
+    },
+    /** 风险审阅按钮操作 */
+    handleAlog() {
+      this.reset();
+      this.alogOpen = true;
+      this.alogForm.approvalLevel = ''
+    },
+    /** 审阅记录按钮操作 */
+    handleAlogInfo() {
+      this.reset();
+      query(this.infoForm.companyInfo.companyId).then(response => {
+        this.alogInfoForm = response.rows;
+        this.alogInfoOpen = true;
+        this.alogInfoTitle = "审阅记录";
+      })
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateInfo(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addInfo(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 风险审阅提交按钮 */
+    alogSubmitForm() {
+      this.$refs["alogForm"].validate(valid => {
+        if (valid) {
+          if(this.alogForm.approvalLevel!=null && this.alogForm.approvalLevel!='' &&
+          this.infoForm.companyInfo.companyId != null && this.infoForm.companyInfo.companyId != ''){
+            this.alogForm.companyId = this.infoForm.companyInfo.companyId;
+            this.alogForm.companyName = this.infoForm.companyInfo.companyName;
+              addAlog(this.alogForm).then(response => {
+                this.$modal.msgSuccess("审阅提交成功");
+                this.alogOpen = false;
+                this.getList();
+              });
+          }else{
+              this.$message.error('请选择审阅等级!');
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除合作企业编号为"' + ids + '"的数据项?').then(function() {
+        return delInfo(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('ctyc/info/export', {
+        ...this.queryParams
+      }, `info_${new Date().getTime()}.xlsx`)
+    },
+    /** 按钮事件控制隐藏 */
+    bt1(){
+      this.ef2 = false;
+      this.ef1 = true;
+      this.bp1 = false;
+      this.bp2 = true;
+    },
+    bt2(){
+      this.ef1 = false;
+      this.ef2 = true;
+      this.bp1 = true;
+      this.bp2 = false;
+    }
+  }
+};
+</script>
+

+ 297 - 0
src/views/ctyc/info/index.vue

@@ -0,0 +1,297 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="企业名称" prop="companyName">
+        <el-input
+          v-model="queryParams.companyName"
+          placeholder="请输入企业名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+     
+      <el-form-item label="监控人员" prop="monitorByName">
+        <el-input
+          v-model="queryParams.monitorByName"
+          placeholder="请输入监控人员名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+          <BatchImport
+            ref="batchImport"
+            @import="handelImport"
+            @temDownload="handleTemDownload"
+            :fileSize="1"></BatchImport>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="infoList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="企业名称" align="center" prop="companyName" />
+      <el-table-column label="监控人员" align="center" prop="monitorByName" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['ctyc:info:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['ctyc:info:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!--修改合作企业对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="企业名称" prop="companyName">
+          <el-input v-model="form.companyName" />
+        </el-form-item>
+        <el-form-item label="监控人员" prop="monitorByName">
+          <ElPopoverSelectV2
+                  ref="materialPopoverSelect"
+                  title="监控人员"
+                  v-model="form.monitorByName"
+                  :source.sync="form"
+                  valueKey="name"
+                  :dataMapping="{monitorBy:'id',monitorByName: 'name'}"
+                  referName="CONTACTS_PARAM"
+                  style="width: 100%"
+                  @change="materialReferenceChange"
+                >
+                </ElPopoverSelectV2>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listInfo, getInfo, delInfo, addInfo, updateInfo, fileImport } from "@/api/ctyc/info";
+
+export default {
+  name: "Info",
+  components: {
+    BatchImport: () => import("@/components/BatchImport/indexa.vue"),
+    ElPopoverSelectV2: () => import("@/components/popover-select-v2/index.vue")
+  },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 合作企业表格数据
+      infoList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        companyId: null,
+        companyName: null,
+        newCompanyName: null,
+        monitorBy: null,
+        monitorByName: null,
+        revision: null,
+        tenantId: null,
+        approvalLevel: null,
+        approvalRemark: null,
+        approvalBy: null,
+        approvalByName: null,
+        approvalTime: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    // 物料参考
+    openMaterialReference() {
+      let { open } = this.$refs.materialPopoverSelect[0];
+      open();
+    },
+    materialReferenceChange(prop, { source }) {
+      this.params.sysMaterialApply = {
+        ...this.params.sysMaterialApply,
+        ...source,
+      };
+    },
+    // 确认导入
+    handelImport(fileList) {
+      this.$modal.loading("加载中...");
+      let formData = new FormData();
+      formData.append("file", fileList[0].raw);
+      fileImport(formData).then((res) => {
+        if (res.code == 200) {
+          this.$modal.closeLoading();
+          this.$notify({
+            message: res.msg,
+            type: res.code == 200 ? "success" : "warning",
+          });
+          let { setVisible } = this.$refs.batchImport;
+          setVisible(false);
+          this.getList();
+        }
+      });
+    },
+    // 模板下载
+    handleTemDownload() {
+      this.download("/ctyc/info/download", {}, `合作企业.xlsx`);
+    },
+    /** 查询合作企业列表 */
+    getList() {
+      this.loading = true;
+      listInfo(this.queryParams).then(response => {
+        this.infoList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        companyId: null,
+        companyName: null,
+        newCompanyName: null,
+        monitorBy: null,
+        monitorByName: null,
+        revision: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        delFlag: null,
+        tenantId: null,
+        approvalLevel: null,
+        approvalRemark: null,
+        approvalBy: null,
+        approvalByName: null,
+        approvalTime: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加合作企业";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getInfo(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改合作企业";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateInfo(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addInfo(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除合作企业编号为"' + ids + '"的数据项?').then(function() {
+        return delInfo(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('ctyc/info/export', {
+        ...this.queryParams
+      }, `info_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 5 - 1
src/views/expend/customerExpend/columns.js

@@ -157,7 +157,11 @@ export default function useColumns() {
     },
     {
       item: { key: "serviceFee", title: "服务费", width: 120, },
-      attr: {}
+      attr: {
+        formatter: (prop) => {
+          return prop.serviceFee ? (Math.round((prop.serviceFee) * 100) / 100) : prop.serviceFee;
+        },
+      }
     },
     {
       item: { key: "materialCode", title: "物料编码" },

+ 103 - 4
src/views/expend/expendMx.vue

@@ -2,7 +2,7 @@
   <div id="expendMx">
     <div v-if="isList">
       <el-card v-loading="loading" style="position: relative">
-        <el-form class="search_area" label-width="auto">
+        <!-- <el-form class="search_area" label-width="auto">
           <el-row :gutter="10">
             <el-col :span="1.5">
               <el-form-item label="编码">
@@ -167,8 +167,16 @@
               </el-form-item>
             </el-col>
           </el-row>
-        </el-form>
+        </el-form> -->
 
+        <el-super-search
+          v-model="params"
+          :size="size"
+          :dict="dict"
+          :columns="SearchColumns"
+          @reset="resetList"
+          @submit="useQuery(params, pageInfo)"
+        ></el-super-search>
         <div class="btn_grooup">
           <!-- <el-button type="primary" size="mini" @click="submits">提交</el-button> -->
 
@@ -245,6 +253,7 @@ export default {
   components: {
     Add: () => import("./expendMxDetail.vue"),
     ElSuperUxTable: () => import("@/components/super-ux-table/index.vue"),
+    ElSuperSearch: () => import("@/components/super-search/index.vue"),
   },
   data() {
     return {
@@ -284,7 +293,93 @@ export default {
       },
       tableData: [],
       selectData: [],
-      // SearchColumns: SearchColumns,
+      SearchColumns: [
+      {
+        item: { key: "code", title: "编码" },
+        attr: {
+          is: "el-input",
+          clearable: true,
+        }
+      },
+      {
+        item: { key: "custName", title: "医院名称" },
+        attr: {
+          is: "el-input",
+          clearable: true,
+        }
+      },
+      {
+        item: { key: "custCode", title: "医院编码" },
+        attr: {
+          is: "el-input",
+          clearable: true,
+        }
+      },
+      {
+        item: { key: "supplierName", title: "供应商名称" },
+        attr: {
+          is: "el-input",
+          clearable: true,
+        }
+      },
+      {
+        item: { key: "supplierCode", title: "供应商编码" },
+        attr: {
+          is: "el-input",
+          clearable: true,
+        }
+      },
+      {
+        item: { key: "startDate", title: "结算开始日期", span: 6 },
+        attr: {
+          is: "el-date-picker",
+          type: "date",
+          placeholder: "请选择",
+          valueFormat: "yyyy-MM-dd",
+          clearable: true,
+        }
+      },
+      {
+        item: { key: "endDate", title: "结算截止日期", span: 6 },
+        attr: {
+          is: "el-date-picker",
+          type: "date",
+          placeholder: "请选择",
+          valueFormat: "yyyy-MM-dd",
+          clearable: true,
+        }
+      },
+      {
+        item: { key: "settleNo", title: "结算单号" },
+        attr: {
+          is: "el-input",
+          clearable: true,
+        }
+      },
+      {
+        item: { key: "isSum", title: "是否汇总" },
+        attr: {
+          is: "el-select",
+          dictName: "sys_number_yes_no",
+          clearable: true,
+        }
+      },
+      {
+        item: { key: "sumCode", title: "汇总单据号" },
+        attr: {
+          is: "el-input",
+          clearable: true,
+        }
+      },
+      {
+        item: { key: "isWhether", title: "是否带量" },
+        attr: {
+          is: "el-select",
+          dictName: "carry_or_not",
+          clearable: true,
+        }
+      },
+      ],
       TableColumns: [
         { item: { key: "code", title: "编码" }, attr: {} },
         {
@@ -294,7 +389,11 @@ export default {
             dictName: "sys_status",
           },
         },
-        { item: { key: "serviceFee", title: "服务费合计" }, attr: {} },
+        { item: { key: "serviceFee", title: "服务费合计" }, attr: {
+          formatter: (prop) => {
+          return prop.serviceFee ? (Math.round((prop.serviceFee) * 100)/100) : prop.serviceFee;
+        },
+        } },
         { item: { key: "custName", title: "医院名称" }, attr: {} },
         { item: { key: "custCode", title: "医院编码" }, attr: {} },
         { item: { key: "supplierCode", title: "供应商编码" }, attr: {} },

+ 55 - 4
src/views/expend/expendMxDetail.vue

@@ -248,6 +248,13 @@
           <el-button
             v-if="sonPageStu == 'check'"
             :size="size"
+            :disabled="!(basicForm.isSum == '0' && (basicForm.sumCode == null || basicForm.sumCode == ''))"
+            @click="cancelDisassembly"
+            >取消拆单</el-button
+          >
+          <el-button
+            v-if="sonPageStu == 'check'"
+            :size="size"
             :disabled="!ids.length"
             @click="useDisassembly"
             >拆 单</el-button
@@ -303,7 +310,7 @@
         keep-source
         beautifyTable
         :checkbox-config="{ highlight: true, trigger: 'row' }"
-        :edit-config="{ trigger: 'click', mode: 'row' }"
+        :edit-config="{ trigger: 'click', mode: 'row'}"
       >
         >
         <ux-table-column resizable type="checkbox" width="50px" fixed="left" />
@@ -315,6 +322,25 @@
         />
         <ux-table-column
           resizable
+          title="拆单数量"
+          field="divideNum"
+          align="center"
+          edit-render
+        >
+        <template v-slot:edit="scope">
+          <span @click.stop>
+            <el-input-number
+              :disabled="!ids.length"
+              :min="1"
+              :max="Number(scope.row.qty)"
+              :size="size"
+              v-model="scope.row.divideNum"
+            />
+            </span>
+          </template>
+        </ux-table-column>
+        <ux-table-column
+          resizable
           title="物料编码"
           field="itemCode"
           align="center"
@@ -380,7 +406,7 @@
             <el-input-number
               clearable
               :disabled="sonDisable"
-              :min="0"
+              :min="1"
               :size="size"
               v-model="scope.row.price"
               @input="changeFei(scope.rowIndex, scope.row)"
@@ -411,6 +437,7 @@ import {
   editSaveMx,
   toOAs,
   divideDoc,
+  cancelDoc,
 } from "@/api/expend/expendMx.js";
 export default {
   props: ["pageStu", "row", "disable"],
@@ -474,7 +501,7 @@ export default {
       get() {
         this.basicForm.serviceFee = this.basicForm.itemList.reduce(
           (sum, item) => {
-            return (sum += this.getToFixed(item.ratio * 0.01 * item.amount));
+            return (Math.round((sum += item.ratio * 0.01 * item.amount) * 10000) / 10000);
           },
           0
         );
@@ -486,7 +513,7 @@ export default {
       get() {
         this.basicForm.totalAmount = this.basicForm.itemList.reduce(
           (sum, item) => {
-            return (sum += this.getToFixed(item.qty * item.price));
+            return (Math.round((sum += item.qty * item.price) * 10000) / 10000);
           },
           0
         );
@@ -503,6 +530,9 @@ export default {
       Mxdetail(row.id).then((res) => {
         if (res.code === 200) {
           this.basicForm = res.data;
+          this.basicForm.itemList.forEach(item => {
+            item.divideNum = Number(item.qty)
+          })
         }
       });
     },
@@ -529,6 +559,18 @@ export default {
       // this.ids = selection.map(item =>{
       //   return item.id
       // })
+      console.log('selection', selection)
+      let lin = selection.map(item => { return item.id })
+      console.log('lin',lin)
+
+      this.basicForm.itemList.forEach(item => {
+        if(!lin.includes(item.id)) {
+          item.divideNum = Number(item.qty)
+        }
+      })
+      // selection.forEach(item => {
+      //   item.divideNum = Number(item.qty)
+      // })
       this.ids = selection;
     },
     editLine() {
@@ -538,6 +580,15 @@ export default {
         this.dialogFormVisible = true;
       }
     },
+    // 取消拆单
+    cancelDisassembly() {
+      cancelDoc(this.basicForm.code).then(res => {
+        if(res.code === 200) {
+          this.$modal.notifySuccess("取消拆单成功");
+          this.back()
+        }
+      })
+    },
     // 拆单
     async useDisassembly() {
       try {

+ 1 - 1
src/views/material/basicFile/index.vue

@@ -235,7 +235,7 @@ export default {
     },
   },
   created() {
-    this.getTagList("material_list");
+    this.getTagList("material");
     this.useList();
   },
 };

+ 197 - 193
src/views/material/changeApply/add/column.js

@@ -1,40 +1,40 @@
-export default function useColumns(){
+export default function useColumns() {
 
   const TableColumns = [
     {
-      item:{
-        key:'code',
-        title:'单据编码',
+      item: {
+        key: 'code',
+        title: '单据编码',
       },
-      attr:{
+      attr: {
         is: "el-input",
-        disabled:true,
+        disabled: true,
       },
     },
     {
-      item:{
-        key:'orgName',
-        title:'所属组织',
+      item: {
+        key: 'orgName',
+        title: '所属组织',
       },
-      attr:{
+      attr: {
         is: "el-popover-select-v2",
         valueKey: "name",
         referName: "ORG_PARAM",
         dataMapping: {
-          orgId:'id'
+          orgId: 'id'
         },
-        disabled:true,
+        disabled: true,
       },
     },
     {
-      item:{
-        key:'status',
-        title:'单据状态',
+      item: {
+        key: 'status',
+        title: '单据状态',
       },
-      attr:{
+      attr: {
         is: "el-select",
         dictName: "documents_status", // 字典名
-        disabled:true,
+        disabled: true,
       },
     },
     // {
@@ -49,60 +49,60 @@ export default function useColumns(){
 
     // },
     {
-      item:{
-        key:'applicationTime',
-        title:'申请时间',
+      item: {
+        key: 'applicationTime',
+        title: '申请时间',
       },
-      attr:{
+      attr: {
         is: "el-date-picker",
         valueFormat: "yyyy-MM-dd HH:mm:ss",
-        disabled:true,
+        disabled: true,
       },
 
     },
     {
-      item:{
-        key:'createByName',
-        title:'创建人',
+      item: {
+        key: 'createByName',
+        title: '创建人',
       },
-      attr:{
+      attr: {
         is: "el-input",
-        disabled:true,
+        disabled: true,
       },
 
     },
     {
-      item:{
-        key:'createTime',
-        title:'创建时间',
+      item: {
+        key: 'createTime',
+        title: '创建时间',
       },
-      attr:{
+      attr: {
         is: "el-date-picker",
         valueFormat: "yyyy-MM-dd HH:mm:ss",
-        disabled:true,
+        disabled: true,
       },
 
     },
     {
-      item:{
-        key:'updateByName',
-        title:'最后修改人',
+      item: {
+        key: 'updateByName',
+        title: '最后修改人',
       },
-      attr:{
+      attr: {
         is: "el-input",
-        disabled:true,
+        disabled: true,
       },
 
     },
     {
-      item:{
-        key:'updateTime',
-        title:'最后修改时间',
+      item: {
+        key: 'updateTime',
+        title: '最后修改时间',
       },
-      attr:{
+      attr: {
         is: "el-date-picker",
         valueFormat: "yyyy-MM-dd HH:mm:ss",
-        disabled:true,
+        disabled: true,
       },
 
     },
@@ -114,21 +114,21 @@ export default function useColumns(){
 
   const TabColumns = [
     {
-      item:{
-        key:'materialBasic',
-        title:'物料信息',
+      item: {
+        key: 'materialBasic',
+        title: '物料信息',
       },
-      attr:{
-        value:[]
+      attr: {
+        value: []
       },
-      TableColumns:[
+      TableColumns: [
         {
-          item:{
-            key:'materialCode',
-            title:'物料编码',
+          item: {
+            key: 'materialCode',
+            title: '物料编码',
             require: true,
           },
-          attr:{
+          attr: {
             // readonly:true,
             is: "el-popover-select-v2",
             valueKey: "code",
@@ -137,35 +137,35 @@ export default function useColumns(){
               materialId: "id",
               materialCode: "code",
               materialName: "name",
-              diCode:'diCode',
-              remark:'remark',
+              diCode: 'diCode',
+              remark: 'remark',
               model: "model",
-              materialClassifyId:'classifyId',
-              productionPermit:'productionPermit',
+              materialClassifyId: 'classifyId',
+              productionPermit: 'productionPermit',
               specification: "specification",
-              storageConditions:'storageCondition',
-              transportCondition:'transportationCondition',
-              medicineMaterial:'isMedicine',
-              factory:'manufacturerId',
-              factoryName:'manufacturerIdName',
-              registrant:'registrant',
-              oneClass:'oneClass',
-              twoClass:'twoClass',
-              threeClass:'threeClass',
-              fourClass:'fourClass',
-              drug:'isDrugNumber',
-              registrationNo:'registrationNo',
-              dosageFrom:'dosageFrom',
+              storageConditions: 'storageCondition',
+              transportCondition: 'transportationCondition',
+              medicineMaterial: 'isMedicine',
+              factory: 'manufacturerId',
+              factoryName: 'manufacturerIdName',
+              registrant: 'registrant',
+              oneClass: 'oneClass',
+              twoClass: 'twoClass',
+              threeClass: 'threeClass',
+              fourClass: 'fourClass',
+              drug: 'isDrugNumber',
+              registrationNo: 'registrationNo',
+              dosageFrom: 'dosageFrom',
               // dosageFromName:'dosageFromName',
-              maintenanceType:'curingType',
-              medicalDevices:'medicalInstruments',
-              leadTime:'deliveryPeriod',
-              isInventoryStatus:'isInventoryStatus',
-              expiryDateManagerment:'expiryDateManagerment',
-              usefulLife:'usefulLife',
-              serialNoManager:'serialNoManager',
-              ratifyBatchNo:'ratifyBatchNo',
-              expiryUnitId:'expiryUnitId',
+              maintenanceType: 'curingType',
+              medicalDevices: 'medicalInstruments',
+              leadTime: 'deliveryPeriod',
+              isInventoryStatus: 'isInventoryStatus',
+              expiryDateManagerment: 'expiryDateManagerment',
+              usefulLife: 'usefulLife',
+              serialNoManager: 'serialNoManager',
+              ratifyBatchNo: 'ratifyBatchNo',
+              expiryUnitId: 'expiryUnitId',
               usefulLifeUnitId: 'usefulLifeUnitId',
               recentWarningPeriod: 'recentWarningPeriod',
               nearOnsetManagerment: 'nearOnsetManagerment',
@@ -176,107 +176,111 @@ export default function useColumns(){
 
         },
         {
-          item:{
-            key:'materialName',
-            title:'物料名称',
+          item: {
+            key: 'materialName',
+            title: '物料名称',
             require: true,
           },
-          attr:{
+          attr: {
             is: "el-input",
             // disabled:true,
           },
 
         },
         {
-          item:{
-            key:'medicineMaterial',
-            title:'医药物料',
+          item: {
+            key: 'medicineMaterial',
+            title: '医药物料',
           },
-          attr:{
+          attr: {
             is: "el-select",
             dictName: "sys_number_yes_no", // 字典名
           },
 
         },
         {
-          item:{
-            key:'productionPermit',
-            title:'生产许可证',
+          item: {
+            key: 'productionPermit',
+            title: '生产许可证',
           },
-          attr:{
+          attr: {
             is: "el-input",
           },
 
         },
         {
-          item:{
-            key:'specification',
-            title:'规格',
+          item: {
+            key: 'specification',
+            title: '规格',
             require: true,
           },
-          attr:{
+          attr: {
             is: "el-input",
-            maxlength:150,
+            maxlength: 150,
           },
 
 
         },
         {
-          item:{
-            key:'model',
-            title:'型号',
+          item: {
+            key: 'model',
+            title: '型号',
           },
-          attr:{
+          attr: {
             is: "el-input",
           },
 
         },
-       
+
         {
-          item:{
-            key:'factoryName',
-            title:'生产厂家/代理人',
+          item: {
+            key: 'factoryName',
+            title: '生产厂家/代理人',
             require: true,
           },
-          attr:{
+          attr: {
             is: "el-popover-select-v2",
             valueKey: "name",
             referName: "MANUFACTURER_PARAM",
             dataMapping: {
-              factory:'id'
+              factory: 'id',
+              // brand: "brand", // 品牌
+              // originPlace: "country", // 产地
+              // originPlaceName: "countryName",
+              // productionPermit: "productionLicense", // 生产许可证
             }
           },
 
         },
         {
-          item:{
-            key:'registrant',
-            title:'注册人/备案人/上市许可持有人',
+          item: {
+            key: 'registrant',
+            title: '注册人/备案人/上市许可持有人',
             require: true,
           },
-          attr:{
+          attr: {
             is: "el-input",
           },
 
         },
         {
-          item:{
-            key:'storageConditions',
-            title:'存储条件',
+          item: {
+            key: 'storageConditions',
+            title: '存储条件',
             require: true,
           },
-          attr:{
+          attr: {
             is: "el-select",
             dictName: "sys_storage_condition", // 字典名
           },
 
         },
         {
-          item:{
-            key:'transportCondition',
-            title:'运输条件',
+          item: {
+            key: 'transportCondition',
+            title: '运输条件',
           },
-          attr:{
+          attr: {
             is: "el-select",
             dictName: "sys_conditions_carriage", // 字典名
           },
@@ -295,85 +299,85 @@ export default function useColumns(){
 
         // },
         {
-          item:{
-            key:'isInventoryStatus',
-            title:'批号及库存状态管理',
+          item: {
+            key: 'isInventoryStatus',
+            title: '批号及库存状态管理',
           },
-          attr:{
+          attr: {
             is: "el-select",
             dictName: "sys_number_yes_no", // 字典名
           },
         },
         {
-          item:{
-            key:'expiryDateManagerment',
-            title:'效期管理',
+          item: {
+            key: 'expiryDateManagerment',
+            title: '效期管理',
           },
-          attr:{
+          attr: {
             is: "el-select",
             dictName: "sys_number_yes_no", // 字典名
           },
         },
         {
-          item:{
-            key:'serialNoManager',
-            title:'是否序列号管理',
+          item: {
+            key: 'serialNoManager',
+            title: '是否序列号管理',
           },
-          attr:{
+          attr: {
             is: "el-select",
             dictName: "sys_number_yes_no", // 字典名
           },
         },
         {
-          item:{
-            key:'usefulLife',
-            title:'有效期',
+          item: {
+            key: 'usefulLife',
+            title: '有效期',
           },
-          attr:{
+          attr: {
             is: "el-input-number",
-            controlsPosition:"right",
-            min:0,
+            controlsPosition: "right",
+            min: 0,
           },
         },
         {
-          item:{
-            key:'expiryUnitId',
-            title:'效期单位',
+          item: {
+            key: 'expiryUnitId',
+            title: '效期单位',
           },
-          attr:{
+          attr: {
             is: "el-select",
             dictName: "period_unit",
             clearable: true,
           },
         },
         {
-          item:{
-            key:'usefulLifeUnitId',
-            title:'有效期至单位',
+          item: {
+            key: 'usefulLifeUnitId',
+            title: '有效期至单位',
           },
-          attr:{
+          attr: {
             is: "el-select",
             dictName: "expiry_date",
             clearable: true,
           },
         },
         {
-          item:{
-            key:'nearOnsetManagerment',
-            title:'近效期管理',
+          item: {
+            key: 'nearOnsetManagerment',
+            title: '近效期管理',
           },
-          attr:{
+          attr: {
             is: "el-select",
             dictName: "sys_number_yes_no",
-            clearable:true,
+            clearable: true,
           },
         },
         {
-          item:{
-            key:'recentWarningPeriod',
-            title:'近效期预警天数',
+          item: {
+            key: 'recentWarningPeriod',
+            title: '近效期预警天数',
           },
-          attr:{
+          attr: {
             is: "el-input-number",
             min: 0,
             controlsPosition: "right",
@@ -402,98 +406,98 @@ export default function useColumns(){
 
         // },
         {
-          item:{
-            key:'oneClass',
-            title:'一级分类',
+          item: {
+            key: 'oneClass',
+            title: '一级分类',
           },
-          attr:{
+          attr: {
             is: "el-input",
-            disabled:true,
+            disabled: true,
           },
 
         },
         {
-          item:{
-            key:'twoClass',
-            title:'二级分类',
+          item: {
+            key: 'twoClass',
+            title: '二级分类',
           },
-          attr:{
+          attr: {
             is: "el-input",
-            disabled:true,
+            disabled: true,
           },
 
         },
         {
-          item:{
-            key:'threeClass',
-            title:'三级分类',
+          item: {
+            key: 'threeClass',
+            title: '三级分类',
           },
-          attr:{
+          attr: {
             is: "el-input",
-            disabled:true,
+            disabled: true,
           },
 
         },
         {
-          item:{
-            key:'fourClass',
-            title:'四级分类',
+          item: {
+            key: 'fourClass',
+            title: '四级分类',
           },
-          attr:{
+          attr: {
             is: "el-input",
-            disabled:true,
+            disabled: true,
           },
 
         },
         {
-          item:{
-            key:'drug',
-            title:'药品',
+          item: {
+            key: 'drug',
+            title: '药品',
           },
-          attr:{
+          attr: {
             is: "el-select",
             dictName: "sys_medicine", // 字典名
           },
 
         },
         {
-          item:{
-            key:'ratifyBatchNo',
-            title:'批准文号',
+          item: {
+            key: 'ratifyBatchNo',
+            title: '批准文号',
           },
-          attr:{
+          attr: {
             is: "el-input",
           },
 
         },
         {
-          item:{
-            key:'registrationNo',
-            title:'注册证号/备案凭证编号',
+          item: {
+            key: 'registrationNo',
+            title: '注册证号/备案凭证编号',
           },
-          attr:{
+          attr: {
             is: "el-input",
           },
 
         },
         {
-          item:{
-            key:'medicalDevices',
+          item: {
+            key: 'medicalDevices',
             // title:'医疗器械',
-            title:'管理类别',
+            title: '管理类别',
           },
-          attr:{
+          attr: {
             is: "el-select",
             dictName: "medical_instruments", // 字典名
           },
 
         },
         {
-          item:{
-            key:'maintenanceType',
-            title:'养护类型',
+          item: {
+            key: 'maintenanceType',
+            title: '养护类型',
           },
-          attr:{
+          attr: {
             is: "el-select",
             dictName: "curing_type", // 字典名
           },
@@ -519,6 +523,6 @@ export default function useColumns(){
     },
   ]
 
-  return {TableColumns,TabColumns}
+  return { TableColumns, TabColumns }
 }
 

+ 248 - 0
src/views/material/extend/annex.vue

@@ -0,0 +1,248 @@
+<template>
+    <div class="app-container">
+        <el-form ref="form" :model="form" :rules="rules" class="baseinfoClass">
+            <el-form-item style="margin-left: -3vw;">
+                <div class="text-with-line">附件</div>
+            </el-form-item> 
+            <el-form-item class="container">
+                <el-button type="danger"  style="margin-right: 4vw;" @click="upload()">上传附件</el-button>
+            </el-form-item> 
+            <el-table
+                :data="submitAnnexData"
+                highlight-current-row
+                style="width: 100%; margin-left: -2vw; text-align: center;">
+                <el-table-column
+                    type="index"
+                    width="50">
+                    </el-table-column>
+                <el-table-column
+                property="suitDept"
+                label="附件"
+                width="240">
+                    <template slot-scope="scope">
+                        <span @click="downfile(scope.row.annex)" class="downfile">{{ scope.row.annexName }}</span>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                property="accountLevel"
+                label="附件说明"
+                width="520">
+                    <template slot-scope="scope">
+                        {{ scope.row.explains }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                label="操作">
+                    <template slot-scope="scope">
+                        <el-button type="danger" icon="el-icon-delete" @click="deleteAnnex(scope.row)"></el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+        </el-form>
+        <el-dialog
+            title="文件上传"
+            :visible.sync="dialogVisible"
+            width="30%"
+            :before-close="handleClose">
+            
+            <el-row>
+                <el-col :span="4">
+                    附件:
+                </el-col>
+                <el-col :span="8">
+                    <el-upload
+                        :action="uploadUrl"
+                        class="upload-demo"
+                        drag
+                        :on-success="onSuccess"
+                        :limit="1"
+                        :headers="headers"
+                        :file-list="thisFile"
+                        multiple>
+                        <i class="el-icon-upload"></i>
+                        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+                    </el-upload>
+                </el-col>
+            </el-row>
+            <el-row>
+                <el-col :span="4">
+                    附件说明:
+                </el-col>
+                <el-col :span="8">
+                    <el-input v-model="uploadExplains"></el-input>
+                </el-col>
+            </el-row>
+            
+            <span slot="footer" class="dialog-footer">
+                <el-button @click="canclUpload">取 消</el-button>
+                <el-button type="primary" @click="submitUpload">确 定</el-button>
+            </span>
+        </el-dialog>
+    </div>
+  </template>  
+  
+  <script>
+  import { EventBus } from '@/views/material/extend/event/event-bus.js';
+  import { getToken } from '@/utils/auth'
+  import { getInfoAnnexByMaterialId, readFile } from "@/api/material/extend/material.js";
+  export default {
+      name: "MaterialAnnex",
+      components: {
+        BatchImport: () => import("@/components/BatchImport/indexa.vue"),
+      },
+      props: {
+        materialId:{
+          type: String,
+          default: ''
+        }
+      },
+      data() {
+        return {
+            uploadExplains: '',
+            dialogVisible: false,
+            form:{},
+            rules:{},
+            thisFile: [],
+            submitAnnexData:[{
+                 id:1,
+                annex: '125410786',
+                annexName: '附件名称.xlsx',
+                explains: '这是一个附件说明'
+            },{
+                id:2,
+                annex: '125410786',
+                annexName: '附件名称.xlsx',
+                explains: '这是一个附件说明'
+            }],
+            currentRow: null,
+            uploadUrl: 
+                process.env.NODE_ENV == "development"
+                ? "/drp-file/document-center/fastdfs/upload"
+                : "/document-center/fastdfs/upload",
+            // 如果需要token认证,添加token到headers
+            headers: {
+                Authorization: 'Bearer ' + getToken()
+             }
+        }
+      },
+      created() {
+        this.getDetailAnnexByMaterialId();
+      },
+      mounted() {
+        // EventBus.$on('sendMaterialAnnex', this.handleSubmitAnnex);
+    },
+      beforeDestroy() {
+        // EventBus.$off('sendMaterialAnnex', this.handleSubmitAnnex);
+      },
+      methods: {
+        getDetailAnnexByMaterialId(){
+            getInfoAnnexByMaterialId(this.materialId).then(response => {
+                this.submitAnnexData = [];
+                this.submitAnnexData = response.data;
+            });
+        },
+        canclUpload(){
+            this.uploadExplains = '';
+            this.thisFile = [];
+            this.dialogVisible = false;
+        },
+        submitUpload(){
+            this.submitAnnexData.push({id:this.thisFile[0].id,
+                                        annex: this.thisFile[0].annex,
+                                        annexName: this.thisFile[0].annexName,
+                                        explains: this.uploadExplains})
+            EventBus.$emit('sendMaterialInfo', this.submitAnnexData);                            
+            this.thisFile = [];
+            this.uploadExplains = '';
+            this.dialogVisible = false;
+        },
+        upload(){
+            this.thisFile = [];
+            this.uploadExplains = '';
+            this.dialogVisible = true;
+        },
+        handleClose(done) {
+            this.thisFile = [];
+            this.uploadExplains = '';
+            this.$confirm('确认关闭?')
+            .then(_ => {
+                done();
+            })
+            .catch(_ => {});
+        },
+        downfile(e){
+            readFile(e).then(response => {
+                window.open('https://dev-sy.derom.com/document-center/minio/'+response.data.filepath);
+            });
+        },
+        onSuccess(e){
+            this.thisFile.push({id:e.id,
+                                        annex: e.id,
+                                        annexName: e.filename,
+                                        name: e.filename});
+        },
+        deleteAnnex(e) {
+          if(this.submitAnnexData.length === 1){
+              this.$message({
+                  message: '当前行无法删除, 请至少保留一条附件信息!',
+                  type: 'warning'
+              });
+              return;
+          }
+          this.submitAnnexData = this.submitAnnexData.filter(row => 
+              row.id != e.id
+          );
+          EventBus.$emit('sendMaterialInfo', this.submitAnnexData);    
+        },
+        handleSubmitAnnex(val){
+            this.$set(this.submitAnnexData, 'pictures', val);
+        },
+      }
+  };
+  </script>
+  
+<style>
+.baseinfoClass {
+    margin-left: 4vw;
+}
+.text-with-line {
+    position: relative;
+    font-size: 16px;
+    color: #333;
+    padding-bottom: 5px; /* 确保条线在文字下方 */
+}
+.text-with-line::after {
+    content: '';
+    position: absolute;
+    left: 0;
+    bottom: 0;
+    width: 100%; /* 条线的宽度 */
+    height: 2px; /* 条线的高度 */
+    background: #000; /* 条线的颜色 */
+}
+.container {
+    display: flex;
+    justify-content: flex-end; /* 这会把子元素放在容器的右边 */
+}  
+.button-container {
+  position: fixed;  /* 使用fixed定位,使得容器始终相对于浏览器窗口 */
+  top: 10px;        /* 距离顶部10像素 */
+  right: 60px;      /* 距离右侧10像素 */
+  z-index: 1000;    /* 设置一个较高的z-index确保按钮在其他内容之上 */
+} 
+.downfile {
+    color:blue;
+    position: relative;
+    text-decoration: none;
+}
+.downfile::after {
+  content: '';
+  position: absolute;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  height: 1px; /* 下划线厚度 */
+  background: blue; /* 下划线颜色 */
+  width: 100%;
+}
+</style>

+ 272 - 0
src/views/material/extend/baseinfo.vue

@@ -0,0 +1,272 @@
+<template>
+  <div class="app-container">
+    <el-form ref="form" :model="form" :rules="rules" class="baseinfoClass" >
+        <el-form-item style="margin-left: -3vw;">
+            <div class="text-with-line">基本信息</div>
+        </el-form-item> 
+        <el-form-item>
+          <el-col :span="8">
+            <span>物料编码:{{submitBaseInfoData.code}}</span>
+          </el-col>
+          <el-col :span="8">
+            <span>物料名称:{{submitBaseInfoData.name}}</span>
+          </el-col>
+          <el-col :span="8">
+            <span>规格:{{submitBaseInfoData.specification}}</span>
+          </el-col>
+        </el-form-item> 
+        <el-form-item>
+          <el-col :span="8">
+            <span>型号:{{submitBaseInfoData.model}}</span>
+          </el-col>
+          <el-col :span="8">
+            <span>生产厂家:{{submitBaseInfoData.manufacturerIdName}}</span>
+          </el-col>
+          <el-col :span="8">
+            <span>产地:{{submitBaseInfoData.originPlaceName}}</span>
+          </el-col>
+        </el-form-item>  
+        <el-form-item>
+          <el-col :span="8">
+            <span>一级分类:{{submitBaseInfoData.oneClassName}}</span>
+          </el-col>
+          <el-col :span="8">
+            <span>二级分类:{{submitBaseInfoData.twoClassName}}</span>
+          </el-col>
+          <el-col :span="8">
+            <span>三级分类:{{submitBaseInfoData.threeClassName}}</span>
+          </el-col>
+        </el-form-item>  
+        <el-form-item>
+          <el-col :span="8">
+            <span>四级分类:{{submitBaseInfoData.fourClassName}}</span>
+          </el-col>
+          <el-col :span="8">
+            <span>储存条件:{{submitBaseInfoData.storageConditionName}}</span>
+          </el-col>
+          <el-col :span="8">
+            <span>运输条件:{{submitBaseInfoData.transportationConditionName}}</span>
+          </el-col>
+        </el-form-item>  
+        <el-form-item>
+          <el-col :span="8">
+            <span>包装说明:{{submitBaseInfoData.packExplain}}</span>
+          </el-col>
+          <el-col :span="8">
+            <span>适用年限/次数:{{submitBaseInfoData.serviceLife || '无'}}</span>
+          </el-col>
+          <el-col :span="8">
+            <span>长度(mm):{{submitBaseInfoData.length}}</span>
+          </el-col>
+        </el-form-item>  
+        <el-form-item>
+          <el-col :span="8">
+            <span>高度(mm):{{submitBaseInfoData.height}}</span>
+          </el-col>
+          <el-col :span="8">
+            <span>宽度(mm):{{submitBaseInfoData.width}}</span>
+          </el-col>
+          <el-col :span="8">
+            <span>负责采购员:{{submitBaseInfoData.puPersonnelIdName}}</span>
+          </el-col>
+        </el-form-item>  
+        <el-form-item>
+            <span>结构及组成:{{submitBaseInfoData.transportationConditionName}}</span>
+        </el-form-item>  
+        <el-form-item>
+            <span>适用范围:{{submitBaseInfoData.transportationConditionName}}</span>
+        </el-form-item>  
+        <el-form-item style="margin-left: -3vw;">
+            <div class="text-with-line">医药行业</div>
+        </el-form-item> 
+        <el-form-item>
+          <el-col :span="8">
+            <span>药品类型:{{submitBaseInfoData.medcines[0].isDrug == "0" ? '药品' : '非药品'}}</span>
+          </el-col>
+          <el-col :span="8">
+            <span>通用名称:{{submitBaseInfoData.medcines[0].commonName}}</span>
+          </el-col>
+          <el-col :span="8">
+            <span>剂型:{{submitBaseInfoData.dosageFormName}}</span>
+          </el-col>
+        </el-form-item>  
+        <el-form-item>
+          <el-col :span="8">
+            <span>医疗器械:{{submitBaseInfoData.medcines[0].medicalInstruments == '0' ? 玻璃仪器 : submitBaseInfoData.medcines[0].medicalInstruments == '1' ? '一类' :submitBaseInfoData.medcines[0].medicalInstruments == '2' ? '二类' :submitBaseInfoData.medcines[0].medicalInstruments == '3' ? '三类' : '无'}}</span>
+          </el-col>
+          <el-col :span="8">
+            <span>养护类型:{{submitBaseInfoData.medcines[0].curingType == "01" ? '一般养护' : '重点养护'}}</span>
+          </el-col>
+        </el-form-item>  
+        <el-form-item style="margin-left: -3vw;">
+            <div class="text-with-line">药品类别</div>
+        </el-form-item> 
+        <el-form-item>
+          <el-col :span="8">
+            <span>药品类别:{{submitBaseInfoData.classifyId}}</span>
+          </el-col>
+          <el-col :span="8">
+            <span>类别名称:{{submitBaseInfoData.classifyIdName}}</span>
+          </el-col>
+        </el-form-item>  
+        <el-form-item style="margin-left: -3vw;">
+            <div class="text-with-line">适用科室</div>
+        </el-form-item> 
+        <el-form-item class="container">
+            <el-button type="danger"  style="margin-right: 4vw;" @click="addSuitDept()">新增适用科室</el-button>
+        </el-form-item> 
+        <el-table
+            :data="tableData"
+            highlight-current-row
+            style="width: 100%; margin-left: -2vw; text-align: center;">
+            <el-table-column
+                type="index"
+                width="50">
+                </el-table-column>
+            <el-table-column
+            property="suitDept"
+            label="适用科室"
+            width="240">
+                <template slot-scope="scope">
+                    <el-input v-model="scope.row.suitDept" placeholder="请输入适用科室" @blur="tableDataBlur"></el-input>
+                </template>
+            </el-table-column>
+            <el-table-column
+            property="accountLevel"
+            label="账号级别"
+            width="360">
+                <template slot-scope="scope">
+                    <el-input v-model="scope.row.accountLevel" placeholder="请输入账号级别" @blur="tableDataBlur"></el-input>
+                </template>
+            </el-table-column>
+            <el-table-column
+            label="操作">
+                <template slot-scope="scope">
+                    <el-button type="danger" icon="el-icon-delete" @click="deleteSuitDept(scope.row)"></el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+    </el-form> 
+  </div>
+</template>  
+
+<script>
+import { EventBus } from '@/views/material/extend/event/event-bus.js';
+import { getInfo, getInfoSuitDeptByMaterialId } from "@/api/material/extend/material.js";
+export default {
+    name: "MaterialBaseInfo",
+    props: {
+      materialId:{
+        type: String,
+        default: ''
+      }
+    },
+    data() {
+      return {
+        // 表单参数
+        form: {},
+        // 表单校验
+        rules: {},
+        submitBaseInfoData: {},
+        tableData: [{
+            id: 1,
+            suitDept: '外科',
+            accountLevel: '王小虎',
+        },{
+            id: 2,
+            suitDept: '外科',
+            accountLevel: '王小虎',
+        }],
+        currentRow: null,
+      };
+    },
+    created() {
+      this.getDetailBaseInfo();
+      this.getDetailSuitDeptByMaterialId();
+    },
+    mounted() {
+        // EventBus.$on('sendMaterialBaseInfo', this.handleSubmitBaseInfo);
+    },
+    beforeDestroy() {
+        // EventBus.$off('sendMaterialBaseInfo', this.handleSubmitBaseInfo);
+    },
+    methods: {
+      getDetailBaseInfo() {
+        getInfo(this.materialId).then(response => {
+          this.submitBaseInfoData = response.data.data;
+        });
+      },
+      getDetailSuitDeptByMaterialId(){
+        getInfoSuitDeptByMaterialId(this.materialId).then(response => {
+          this.tableData = [];
+          this.tableData = response.data;
+        });
+      },
+        handleSubmitBaseInfo(val){
+          this.$set(this.submitBaseInfoData, 'annex', val);
+        },
+        setCurrent(row) {
+            this.$refs.singleTable.setCurrentRow(row);
+        },
+        handleCurrentChange(val) {
+            this.currentRow = val;
+        },
+        addSuitDept() {
+            const newRow = { id: this.randomLong(), suitDept: '', accountLevel: '' };
+            this.tableData.push(newRow);
+        },
+        deleteSuitDept(e) {
+          if(this.tableData.length === 1){
+              this.$message({
+                  message: '当前行无法删除, 请至少保留一条适用科室信息!',
+                  type: 'warning'
+              });
+              return;
+          }
+          this.tableData = this.tableData.filter(row => 
+              row.id != e.id
+          );
+          EventBus.$emit('sendMaterialInfo', this.tableData);
+        },
+        tableDataBlur(){
+          EventBus.$emit('sendMaterialInfo', this.tableData);
+        },
+        randomLong() {
+            const min = Number.MIN_SAFE_INTEGER;
+            const max = Number.MAX_SAFE_INTEGER;
+            // 50% chance of a negative number
+            const isNegative = Math.random() < 0.5; 
+            const randomValue = Math.random() * (max - min) + min;
+            return isNegative ? Math.round(randomValue) : Math.round(randomValue) * -1;
+        }
+    }
+    
+};
+</script>
+
+<style>
+    .baseinfoClass {
+        margin-left: 4vw;
+    }
+    .text-with-line {
+        position: relative;
+        font-size: 16px;
+        color: #333;
+        padding-bottom: 5px; /* 确保条线在文字下方 */
+    }
+    .text-with-line::after {
+        content: '';
+        position: absolute;
+        left: 0;
+        bottom: 0;
+        width: 100%; /* 条线的宽度 */
+        height: 2px; /* 条线的高度 */
+        background: #000; /* 条线的颜色 */
+    }
+    .container {
+        display: flex;
+        justify-content: flex-end; /* 这会把子元素放在容器的右边 */
+    }  
+
+</style>
+  

+ 121 - 0
src/views/material/extend/detailMain.vue

@@ -0,0 +1,121 @@
+<template>
+    <div class="app-container">
+        <el-tabs v-model="activeName" >
+            <el-tab-pane label="基本信息" name="MaterialBaseInfo" >
+                <MaterialBaseInfo :materialId="materialId"></MaterialBaseInfo>
+            </el-tab-pane>
+            <el-tab-pane label="物料图册" name="MaterialPictures" >
+                <MaterialPictures :materialId="materialId"></MaterialPictures>
+            </el-tab-pane>
+            <el-tab-pane label="资质信息" name="MaterialQualifications" >
+                <MaterialQualifications :materialId="materialId"></MaterialQualifications>
+            </el-tab-pane>
+            <el-tab-pane label="销售情况" name="MaterialSale" >
+                <MaterialSale :materialId="materialId"></MaterialSale>
+            </el-tab-pane>
+            <el-tab-pane label="附件" name="MaterialAnnex" >
+                <MaterialAnnex :materialId="materialId"></MaterialAnnex>
+            </el-tab-pane>
+        </el-tabs>
+        <div class="button-container">
+            <el-button type="danger" @click="qx">取消</el-button>
+            <el-button type="danger" @click="bc">保存</el-button>
+        </div>
+    </div>
+</template>
+<script>
+import { infoSave } from "@/api/material/extend/material.js";
+import MaterialBaseInfo from '@/views/material/extend/baseinfo';
+import MaterialAnnex from '@/views/material/extend/annex';
+import MaterialPictures from '@/views/material/extend/pictures';
+import MaterialQualifications from '@/views/material/extend/qualifications';
+import MaterialSale from '@/views/material/extend/sale';
+import { EventBus } from '@/views/material/extend/event/event-bus.js';
+  export default {
+    name: "MaterialDetailMain",
+    components: {
+        MaterialBaseInfo,
+        MaterialAnnex,
+        MaterialPictures,
+        MaterialQualifications,
+        MaterialSale
+    },
+    data() {
+      return {
+        activeName: 'MaterialBaseInfo', // 默认激活第一个标签
+        materialId:'430016',
+        dataSave: {
+        },
+      };
+    },
+    created() {
+        this.$set(this.dataSave, 'materialId', this.materialId);
+    },
+    mounted() {
+        EventBus.$on('sendMaterialInfo', this.handleSubmit);
+    },
+    beforeDestroy() {
+        EventBus.$off('sendMaterialInfo', this.handleSubmit);
+    },
+    methods: {
+        handleSubmit(val){
+            console.log("E:::" + JSON.stringify(val))
+            if(JSON.stringify(val).includes('homePicture')){
+                // 物料图册
+                this.$set(this.dataSave, 'materialPictures', {});
+                this.$set(this.dataSave, 'materialPictures', val);
+            }
+            if(JSON.stringify(val).includes('annex')){
+                // 附件
+                this.$set(this.dataSave, 'materialAnnex', []);
+                this.$set(this.dataSave, 'materialAnnex', val);
+            }
+            if(JSON.stringify(val).includes('suitDept')){
+                // 适用科室
+                this.$set(this.dataSave, 'materialSuitDept', []);
+                this.$set(this.dataSave, 'materialSuitDept', val);
+            }
+        },
+        bc(){
+            if(this.dataSave.materialSuitDept != undefined && this.dataSave.materialSuitDept.length > 0){
+                let flag = false;
+                this.dataSave.materialSuitDept.forEach(e => {
+                    if(e.suitDept == ''){
+                        flag = true;
+                    }
+                });
+                if(flag){
+                    this.$message({
+                        message: '无法保存, 当前存在未填写的适用科室信息, 请处理 !',
+                        type: 'error'
+                    });
+                    return;
+                };
+            }
+            // 提交
+            infoSave(this.dataSave).then(response => {
+                if(response.code == 200){
+                    this.$message({
+                        message: '保存成功 !',
+                        type: 'success'
+                    });
+                }
+            });
+        },
+        qx(){
+
+        }
+    },
+  };
+</script>
+
+<style>
+    .button-container {
+      position: fixed;  /* 使用fixed定位,使得容器始终相对于浏览器窗口 */
+      top: 10px;        /* 距离顶部10像素 */
+      right: 60px;      /* 距离右侧10像素 */
+      z-index: 1000;    /* 设置一个较高的z-index确保按钮在其他内容之上 */
+    } 
+</style>
+
+  

+ 4 - 0
src/views/material/extend/event/event-bus.js

@@ -0,0 +1,4 @@
+import Vue from 'vue';
+
+// 创建一个事件总线
+export const EventBus = new Vue();

+ 0 - 0
src/views/material/extend/indexMain.vue


+ 756 - 0
src/views/material/extend/pictures.vue

@@ -0,0 +1,756 @@
+<template>
+    <div class="app-container">
+        <el-form ref="form" :model="form" :rules="rules" class="baseinfoClass">
+            <el-form-item style="margin-left: -3vw;">
+                <div class="text-with-line">物料图册</div>
+            </el-form-item> 
+            <el-row>
+                <el-col :span="1" style="margin-top: 5px;">
+                    <span >首页图册</span>
+                </el-col>
+                <el-col :span="8">
+                    <el-button type="success" size="small" style="width: 90px;" @click="downBtn1">下载</el-button>
+                    <el-button type="danger" size="small" style="width: 90px;" @click="deleteBtn1">删除</el-button>
+                </el-col>
+                <el-col :span="1" style="margin-top: 5px;">
+                    <span >详情图册</span>
+                </el-col>
+                <el-col :span="8">
+                    <el-button type="success" size="small" style="width: 90px;" @click="downBtn2">下载</el-button>
+                    <el-button type="danger" size="small" style="width: 90px;" @click="deleteBtn2">删除</el-button>
+                </el-col>
+            </el-row> 
+            <el-row style="margin-top: 24px;">
+                <el-col :span="1" style="min-height:1px;"></el-col>
+                <el-col :span="9">
+                    <el-upload
+                        class="upload-demo"
+                        drag
+                        :action="uploadUrl"
+                        :on-success="onSuccess1"
+                        :on-remove="onRemove1"
+                        accept="image/png, image/jpeg"
+                        :headers="headers"
+                        multiple>
+                        <i class="el-icon-upload"></i>
+                        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+                        <div class="el-upload__tip" slot="tip">只能上传jpg/png文件,且不超过500kb</div>
+                    </el-upload>
+                </el-col>
+                <el-col :span="12">
+                    <el-upload
+                        class="upload-demo"
+                        drag
+                        :action="uploadUrl"
+                        :on-success="onSuccess2"
+                        :on-remove="onRemove2"
+                        accept="image/png, image/jpeg"
+                        :headers="headers"
+                        multiple>
+                        <i class="el-icon-upload"></i>
+                        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+                        <div class="el-upload__tip" slot="tip">只能上传jpg/png文件,且不超过500kb</div>
+                    </el-upload>
+                </el-col>
+            </el-row> 
+            <el-row style="margin-top: 30px;">
+                <el-col :span="1" style="margin-top: 5px;">
+                    <span >首页视频</span>
+                </el-col>
+                <el-col :span="8">
+                    <el-button type="success" size="small" style="width: 90px;" @click="downBtn3">下载</el-button>
+                    <el-button type="danger" size="small" style="width: 90px;" @click="deleteBtn3">删除</el-button>
+                </el-col>
+                <el-col :span="1" style="margin-top: 5px;">
+                    <span >详情视频</span>
+                </el-col>
+                <el-col :span="8">
+                    <el-button type="success" size="small" style="width: 90px;" @click="downBtn4">下载</el-button>
+                    <el-button type="danger" size="small" style="width: 90px;" @click="deleteBtn4">删除</el-button>
+                </el-col>
+            </el-row> 
+            <el-row style="margin-top: 24px;">
+                <el-col :span="1" style="min-height:1px;"></el-col>
+                <el-col :span="9">
+                    <el-upload
+                        class="upload-demo"
+                        drag
+                        :action="uploadUrl"
+                        :on-success="onSuccess3"
+                        :on-remove="onRemove3"
+                        :before-upload="beforeUpload3"
+                        :headers="headers"
+                        multiple>
+                        <i class="el-icon-upload"></i>
+                        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+                        <div class="el-upload__tip" slot="tip">每个附件大小不可超过<em>5M</em>, 支持格式MP4</div>
+                    </el-upload>
+                </el-col>
+                <el-col :span="12">
+                    <el-upload
+                        class="upload-demo"
+                        drag
+                        :action="uploadUrl"
+                        :on-success="onSuccess4"
+                        :on-remove="onRemove4"
+                        :before-upload="beforeUpload4"
+                        :headers="headers"
+                        multiple>
+                        <i class="el-icon-upload"></i>
+                        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+                        <div class="el-upload__tip" slot="tip">每个附件大小不可超过<em>5M</em>, 支持格式MP4</div>
+                    </el-upload>
+                </el-col>
+            </el-row> 
+        </el-form>    
+    </div>
+  </template>  
+  
+  <script>
+  import { EventBus } from '@/views/material/extend/event/event-bus.js';
+  import { getToken } from '@/utils/auth';
+  import { getInfoPicturesByMaterialId, readFile } from "@/api/material/extend/material.js";
+  import JSZip from 'jszip';
+  import FileSaver from 'file-saver';
+  export default {
+      name: "MaterialPictures",
+      components: {
+        BatchImport: () => import("@/components/BatchImport/indexa.vue"),
+      },
+      props: {
+        materialId:{
+          type: String,
+          default: ''
+        }
+      },
+      data() {
+        return {
+            form:{},
+            rules:{},
+            uploadUrl: 
+                process.env.NODE_ENV == "development"
+                ? "/drp-file/document-center/fastdfs/upload"
+                : "/document-center/fastdfs/upload",
+            // 如果需要token认证,添加token到headers
+            headers: {
+                Authorization: 'Bearer ' + getToken()
+            },
+            sendMaterialPictures:{
+                id: 1,
+                materialId: '432986',
+                homePicture: '123,123',
+                homeVideo: '123,123',
+                infoPicture: '123,123',
+                infoVideo: '123,123'
+            },
+            fileList1: [],
+            fileList2: [],
+            fileList3: [],
+            fileList4: [],
+        }
+      },
+      created() {
+        this.getDetailPicturesByMaterialId();
+      },
+      mounted() {
+        // EventBus.$on('sendMaterialPictures', this.sendMaterialPictures);
+      },
+      beforeDestroy() {
+        // EventBus.$off('sendMaterialPictures', this.sendMaterialPictures);
+      },
+      methods: {
+        getDetailPicturesByMaterialId(){
+            getInfoPicturesByMaterialId(this.materialId).then(response => {
+                this.sendMaterialPictures = {
+                    id: '',
+                    materialId: '',
+                    homePicture: '',
+                    homeVideo: '',
+                    infoPicture: '',
+                    infoVideo: ''
+                };
+                if(response.data != undefined){
+                    this.sendMaterialPictures = response.data;
+                }
+            });
+        },
+        // sendMaterialPictures(val){
+        //     this.$set(this.sendMaterialPictures, 'annex', val);
+        // },
+        getTimestamp() {
+            return Date.now();
+        },
+        downBtn1(){
+            if(this.sendMaterialPictures.homePicture != ''){
+                if(this.sendMaterialPictures.homePicture.includes(',')){
+                    let fileInfoList = [];
+                    let pics = this.sendMaterialPictures.homePicture.split(',');
+                    let flag = false;
+                    pics.forEach((element,index) => {
+                        if(index == pics.length-1){
+                            flag = true;
+                        }
+                        readFile(element).then(response => {
+                            let newdx = {'fileUrl': 'https://dev-sy.derom.com/document-center/minio/'+response.data.filepath, 'renameFileName': response.data.filepath};
+                            fileInfoList.push(newdx);
+                        });
+                        if(flag){
+                            setTimeout(()=>{
+                                this.filesToRar(fileInfoList, this.getTimestamp());
+                            },1000)
+                        }
+                    });
+                }else{
+                    readFile(this.sendMaterialPictures.homePicture).then(response => {
+                        let fileInfoList = [];
+                        let newdx = {'fileUrl': 'https://dev-sy.derom.com/document-center/minio/'+response.data.filepath, 'renameFileName': response.data.filepath};
+                            fileInfoList.push(newdx);
+                        this.filesToRar(fileInfoList, this.getTimestamp());
+                    });
+                }
+            }else{
+                this.$message({
+                    type: 'info',
+                    message: '当前文件是空的, 请上传文件 !'
+                });
+            }
+        },
+        downBtn2(){
+            if(this.sendMaterialPictures.infoPicture != ''){
+                if(this.sendMaterialPictures.infoPicture.includes(',')){
+                    let fileInfoList = [];
+                    let pics = this.sendMaterialPictures.infoPicture.split(',');
+                    let flag = false;
+                    pics.forEach((element,index) => {
+                        if(index == pics.length-1){
+                            flag = true;
+                        }
+                        readFile(element).then(response => {
+                            let newdx = {'fileUrl': 'https://dev-sy.derom.com/document-center/minio/'+response.data.filepath, 'renameFileName': response.data.filepath};
+                            fileInfoList.push(newdx);
+                        });
+                        if(flag){
+                            setTimeout(()=>{
+                                this.filesToRar(fileInfoList, this.getTimestamp());
+                            },1000)
+                        }
+                    });
+                }else{
+                    readFile(this.sendMaterialPictures.infoPicture).then(response => {
+                        let fileInfoList = [];
+                        let newdx = {'fileUrl': 'https://dev-sy.derom.com/document-center/minio/'+response.data.filepath, 'renameFileName': response.data.filepath};
+                            fileInfoList.push(newdx);
+                        this.filesToRar(fileInfoList, this.getTimestamp());
+                    });
+                }
+            }else{
+                this.$message({
+                    type: 'info',
+                    message: '当前文件是空的, 请上传文件 !'
+                });
+            }
+        },
+        downBtn3(){
+            if(this.sendMaterialPictures.homeVideo != ''){
+                if(this.sendMaterialPictures.homeVideo.includes(',')){
+                    let fileInfoList = [];
+                    let pics = this.sendMaterialPictures.homeVideo.split(',');
+                    let flag = false;
+                    pics.forEach((element,index) => {
+                        if(index == pics.length-1){
+                            flag = true;
+                        }
+                        readFile(element).then(response => {
+                            let newdx = {'fileUrl': 'https://dev-sy.derom.com/document-center/minio/'+response.data.filepath, 'renameFileName': response.data.filepath};
+                            fileInfoList.push(newdx);
+                        });
+                        if(flag){
+                            setTimeout(()=>{
+                                this.filesToRar(fileInfoList, this.getTimestamp());
+                            },1000)
+                        }
+                    });
+                }else{
+                    readFile(this.sendMaterialPictures.homeVideo).then(response => {
+                        let fileInfoList = [];
+                        let newdx = {'fileUrl': 'https://dev-sy.derom.com/document-center/minio/'+response.data.filepath, 'renameFileName': response.data.filepath};
+                            fileInfoList.push(newdx);
+                        this.filesToRar(fileInfoList, this.getTimestamp());
+                    });
+                }
+            }else{
+                this.$message({
+                    type: 'info',
+                    message: '当前文件是空的, 请上传文件 !'
+                });
+            }
+        },
+        downBtn4(){
+            if(this.sendMaterialPictures.infoVideo != ''){
+                if(this.sendMaterialPictures.infoVideo.includes(',')){
+                    let fileInfoList = [];
+                    let pics = this.sendMaterialPictures.infoVideo.split(',');
+                    let flag = false;
+                    pics.forEach((element,index) => {
+                        if(index == pics.length-1){
+                            flag = true;
+                        }
+                        readFile(element).then(response => {
+                            let newdx = {'fileUrl': 'https://dev-sy.derom.com/document-center/minio/'+response.data.filepath, 'renameFileName': response.data.filepath};
+                            fileInfoList.push(newdx);
+                        });
+                        if(flag){
+                            setTimeout(()=>{
+                                this.filesToRar(fileInfoList, this.getTimestamp());
+                            },1000)
+                        }
+                    });
+                }else{
+                    readFile(this.sendMaterialPictures.infoVideo).then(response => {
+                        let fileInfoList = [];
+                        let newdx = {'fileUrl': 'https://dev-sy.derom.com/document-center/minio/'+response.data.filepath, 'renameFileName': response.data.filepath};
+                            fileInfoList.push(newdx);
+                        this.filesToRar(fileInfoList, this.getTimestamp());
+                    });
+                }
+            }else{
+                this.$message({
+                    type: 'info',
+                    message: '当前文件是空的, 请上传文件 !'
+                });
+            }
+        },
+        deleteBtn1(){
+            this.deleteFileKey('homePicture');
+        },
+        deleteBtn2(){
+            this.deleteFileKey('infoPicture');
+        },
+        deleteBtn3(){
+            this.deleteFileKey('homeVideo');
+        },
+        deleteBtn4(){
+            this.deleteFileKey('infoVideo');
+        },
+        deleteFileKey(val){
+            this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
+                confirmButtonText: '确定',
+                cancelButtonText: '取消',
+                type: 'warning'
+            }).then(() => {
+                this.$set(this.sendMaterialPictures, val, '');
+                this.$message({
+                    type: 'success',
+                    message: '删除成功!'
+                });
+                if(val == 'homePicture'){
+                    this.submitBus1();
+                }
+                if(val == 'infoPicture'){
+                    this.submitBus2();
+                }
+                if(val == 'homeVideo'){
+                    this.submitBus3();
+                }
+                if(val == 'infoVideo'){
+                    this.submitBus4();
+                }
+            }).catch(() => {
+                this.$message({
+                    type: 'info',
+                    message: '已取消删除'
+                });          
+            });
+        },
+        onSuccess1(e){
+            this.fileList1.push({id: e.id, name:e.filename})
+            this.submitBus1();
+        },
+        onSuccess2(e){
+            this.fileList2.push({id: e.id, name:e.filename})
+            this.submitBus2();
+        },
+        onSuccess3(e){
+            this.fileList3.push({id: e.id, name:e.filename})
+            this.submitBus3();
+        },
+        onSuccess4(e){
+            this.fileList4.push({id: e.id, name:e.filename})
+            this.submitBus4();
+        },
+        onRemove1(e){
+            this.fileList1 = this.fileList1.filter(row => 
+              row.id != e.response.id
+            );
+            let _this = this;
+            if(_this.sendMaterialPictures.homePicture != ''){
+                if(_this.sendMaterialPictures.homePicture.includes(',')){
+                    let sz1 = _this.sendMaterialPictures.homePicture.split(',');
+                    sz1 = sz1.filter(row => 
+                        row != e.response.id
+                    );
+                    _this.sendMaterialPictures.homePicture = sz1.join(',');
+                }else{
+                    if(_this.sendMaterialPictures.homePicture == e.response.id){
+                        _this.$set(_this.sendMaterialPictures, 'homePicture', '');
+                    }
+                }
+            }
+            _this.submitBus1();
+        },
+        onRemove2(e){
+            this.fileList2 = this.fileList2.filter(row => 
+              row.id != e.response.id
+            );
+            let _this = this;
+            if(_this.sendMaterialPictures.infoPicture != ''){
+                if(_this.sendMaterialPictures.infoPicture.includes(',')){
+                    let sz2 = _this.sendMaterialPictures.infoPicture.split(',');
+                    sz2 = sz2.filter(row => 
+                        row != e.response.id
+                    );
+                    _this.sendMaterialPictures.infoPicture = sz2.join(',');
+                }else{
+                    if(_this.sendMaterialPictures.infoPicture == e.response.id){
+                        _this.$set(_this.sendMaterialPictures, 'infoPicture', '');
+                    }
+                }
+            }
+            _this.submitBus2();
+        },
+        onRemove3(e){
+            this.fileList3 = this.fileList3.filter(row => 
+              row.id != e.response.id
+            );
+            let _this = this;
+            if(_this.sendMaterialPictures.homeVideo != ''){
+                if(_this.sendMaterialPictures.homeVideo.includes(',')){
+                    let sz3 = _this.sendMaterialPictures.homeVideo.split(',');
+                    sz3 = sz3.filter(row => 
+                        row != e.response.id
+                    );
+                    _this.sendMaterialPictures.homeVideo = sz3.join(',');
+                }else{
+                    if(_this.sendMaterialPictures.homeVideo == e.response.id){
+                        _this.$set(_this.sendMaterialPictures, 'homeVideo', '');
+                    }
+                }
+            }
+            _this.submitBus3();
+        },
+        onRemove4(e){
+            this.fileList4 = this.fileList4.filter(row => 
+              row.id != e.response.id
+            );
+            let _this = this;
+            if(_this.sendMaterialPictures.infoVideo != ''){
+                if(_this.sendMaterialPictures.infoVideo.includes(',')){
+                    let sz4 = _this.sendMaterialPictures.infoVideo.split(',');
+                    sz4 = sz4.filter(row => 
+                        row != e.response.id
+                    );
+                    _this.sendMaterialPictures.infoVideo = sz4.join(',');
+                }else{
+                    if(_this.sendMaterialPictures.infoVideo == e.response.id){
+                        _this.$set(_this.sendMaterialPictures, 'infoVideo', '');
+                    }
+                }
+            }
+            _this.submitBus4();
+        },
+        beforeUpload3(file){
+            const isMP4 = file.type === 'video/mp4';
+            if (!isMP4) {
+                this.$message.error('只能上传MP4格式的视频!');
+            }
+            return isMP4;
+        },
+        beforeUpload4(file){
+            const isMP4 = file.type === 'video/mp4';
+            if (!isMP4) {
+                this.$message.error('只能上传MP4格式的视频!');
+            }
+            return isMP4;
+        },
+        submitBus1(){
+            if(this.sendMaterialPictures.homePicture.includes(',')){
+                let result = '';
+                this.fileList1.forEach(e1 => {
+                    let flag = true;
+                    this.sendMaterialPictures.homePicture.split(',').forEach(e2 => {
+                        if(e1.id == e2){
+                            flag = false;
+                        }
+                    });
+                    if(flag){
+                        result = result+','+e1.id;
+                    }
+                });
+                this.sendMaterialPictures.homePicture = this.sendMaterialPictures.homePicture + result;
+            }else{
+                if(this.sendMaterialPictures.homePicture != ''){
+                    this.fileList1.forEach((e1,index) => {
+                        if(this.sendMaterialPictures.homePicture != e1.id){
+                            this.sendMaterialPictures.homePicture = this.sendMaterialPictures.homePicture+','+e1.id;
+                        }
+                    });
+                }else{
+                    if(this.fileList1.length > 0){
+                        if(this.fileList1.length == 1){
+                            this.sendMaterialPictures.homePicture = this.fileList1[0].id+"";
+                        }else{
+                            let resu = '';
+                            if(this.sendMaterialPictures.homePicture != ''){
+                                this.fileList1.forEach(element => {
+                                    resu = resu +','+ element.id;
+                                });
+                                this.sendMaterialPictures.homePicture = this.sendMaterialPictures.homePicture + resu;
+                            }else{
+                                this.fileList1.forEach(element => {
+                                    resu = resu + element.id + ','
+                                })
+                                resu = resu.slice(0, -1);
+                                this.sendMaterialPictures.homePicture = this.sendMaterialPictures.homePicture + resu ;
+                            }
+                        }
+                    }
+                    
+                }
+            }
+            EventBus.$emit('sendMaterialInfo', this.sendMaterialPictures);
+        },
+        submitBus2(){
+            if(this.sendMaterialPictures.infoPicture.includes(',')){
+                let result = '';
+                this.fileList2.forEach(e1 => {
+                    let flag = true;
+                    this.sendMaterialPictures.infoPicture.split(',').forEach(e2 => {
+                        if(e1.id == e2){
+                            flag = false;
+                        }
+                    });
+                    if(flag){
+                        result = result+','+e1.id;
+                    }
+                });
+                this.sendMaterialPictures.infoPicture = this.sendMaterialPictures.infoPicture + result;
+            }else{
+                if(this.sendMaterialPictures.infoPicture != ''){
+                    this.fileList2.forEach((e1,index) => {
+                        if(this.sendMaterialPictures.infoPicture != e1.id){
+                            this.sendMaterialPictures.infoPicture = this.sendMaterialPictures.infoPicture+','+e1.id;
+                        }
+                    });
+                }else{
+                    if(this.fileList2.length > 0){
+                        if(this.fileList2.length == 1){
+                            this.sendMaterialPictures.infoPicture = this.fileList2[0].id+"";
+                        }else{
+                            let resu = '';
+                            if(this.sendMaterialPictures.infoPicture != ''){
+                                this.fileList2.forEach(element => {
+                                    resu = resu +','+ element.id;
+                                });
+                                this.sendMaterialPictures.infoPicture = this.sendMaterialPictures.infoPicture + resu;
+                            }else{
+                                this.fileList2.forEach(element => {
+                                    resu = resu + element.id + ','
+                                })
+                                resu = resu.slice(0, -1);
+                                this.sendMaterialPictures.infoPicture = this.sendMaterialPictures.infoPicture + resu ;
+                            }
+                        }
+                    }
+                    
+                }
+            }
+            EventBus.$emit('sendMaterialInfo', this.sendMaterialPictures);
+        },
+        submitBus3(){
+            if(this.sendMaterialPictures.homeVideo.includes(',')){
+                let result = '';
+                this.fileList3.forEach(e1 => {
+                    let flag = true;
+                    this.sendMaterialPictures.homeVideo.split(',').forEach(e2 => {
+                        if(e1.id == e2){
+                            flag = false;
+                        }
+                    });
+                    if(flag){
+                        result = result+','+e1.id;
+                    }
+                });
+                this.sendMaterialPictures.homeVideo = this.sendMaterialPictures.homeVideo + result;
+            }else{
+                if(this.sendMaterialPictures.homeVideo != ''){
+                    this.fileList3.forEach((e1,index) => {
+                        if(this.sendMaterialPictures.homeVideo != e1.id){
+                            this.sendMaterialPictures.homeVideo = this.sendMaterialPictures.homeVideo+','+e1.id;
+                        }
+                    });
+                }else{
+                    if(this.fileList3.length > 0){
+                        if(this.fileList3.length == 1){
+                            this.sendMaterialPictures.homeVideo = this.fileList3[0].id+"";
+                        }else{
+                            let resu = '';
+                            if(this.sendMaterialPictures.homeVideo != ''){
+                                this.fileList3.forEach(element => {
+                                    resu = resu +','+ element.id;
+                                });
+                                this.sendMaterialPictures.homeVideo = this.sendMaterialPictures.homeVideo + resu;
+                            }else{
+                                this.fileList3.forEach(element => {
+                                    resu = resu + element.id + ','
+                                })
+                                resu = resu.slice(0, -1);
+                                this.sendMaterialPictures.homeVideo = this.sendMaterialPictures.homeVideo + resu ;
+                            }
+                        }
+                    }
+                }
+            }
+            EventBus.$emit('sendMaterialInfo', this.sendMaterialPictures);
+        },
+        submitBus4(){
+            if(this.sendMaterialPictures.infoVideo.includes(',')){
+                let result = '';
+                this.fileList4.forEach(e1 => {
+                    let flag = true;
+                    this.sendMaterialPictures.infoVideo.split(',').forEach(e2 => {
+                        if(e1.id == e2){
+                            flag = false;
+                        }
+                    });
+                    if(flag){
+                        result = result+','+e1.id;
+                    }
+                });
+                this.sendMaterialPictures.infoVideo = this.sendMaterialPictures.infoVideo + result;
+            }else{
+                if(this.sendMaterialPictures.infoVideo != ''){
+                    this.fileList4.forEach((e1,index) => {
+                        if(this.sendMaterialPictures.infoVideo != e1.id){
+                            this.sendMaterialPictures.infoVideo = this.sendMaterialPictures.infoVideo+','+e1.id;
+                        }
+                    });
+                }else{
+                    if(this.fileList4.length > 0){
+                        if(this.fileList4.length == 1){
+                            this.sendMaterialPictures.infoVideo = this.fileList4[0].id+"";
+                        }else{
+                            let resu = '';
+                            if(this.sendMaterialPictures.infoVideo != ''){
+                                this.fileList4.forEach(element => {
+                                    resu = resu +','+ element.id;
+                                });
+                                this.sendMaterialPictures.infoVideo = this.sendMaterialPictures.infoVideo + resu;
+                            }else{
+                                this.fileList4.forEach(element => {
+                                    resu = resu + element.id + ','
+                                })
+                                resu = resu.slice(0, -1);
+                                this.sendMaterialPictures.infoVideo = this.sendMaterialPictures.infoVideo + resu ;
+                            }
+                        }
+                    }
+                }
+            }
+            EventBus.$emit('sendMaterialInfo', this.sendMaterialPictures);
+        },
+        /**文件打包* arrImages:文件list:[{fileUrl:文件url,renameFileName:文件名}]* filename 压缩包名* */
+        filesToRar(arrImages, filename) {
+            let _this = this;
+            let zip = new JSZip();
+            let cache = {};
+            let promises = [];
+            _this.title = '正在加载压缩文件';
+            const loading = this.$loading({lock: true,text: '正在加载压缩文件',spinner: 'el-icon-loading',background: 'rgba(0, 0, 0, 0.7)'});
+            for (let item of arrImages) {
+                // 下载文件, 并存成ArrayBuffer对象
+                const promise = this.getImgArrayBuffer(item.fileUrl).then(data => { 
+                // 获取文件名
+                const file_name = item.renameFileName;
+                // 逐个添加文件
+                zip.file(file_name, data, { binary: true })           
+                cache[file_name] = data})
+                promises.push(promise);
+            }
+            Promise.all(promises)
+            // 生成二进制流
+            .then(() => {zip.generateAsync({ type: "blob" })
+            .then(content => {_this.title = '正在压缩';
+                // 利用file-saver保存文件  自定义文件名
+                FileSaver.saveAs(content, filename);             
+                _this.title = '压缩完成';}
+            );
+            loading.close();
+            }).catch(res=>{
+                _this.$message.error('文件压缩失败');
+                loading.close();
+            });
+        },
+        getImgArrayBuffer(url) {
+            return new Promise((resolve, reject) => {
+                //通过请求获取文件blob格式
+                let xmlhttp = new XMLHttpRequest();
+                xmlhttp.open("GET", url, true);
+                xmlhttp.responseType = "blob";
+                xmlhttp.onload = function () {
+                if (this.status == 200) {
+                    resolve(this.response);
+                } else {
+                    reject(this.status);
+                }};
+                xmlhttp.send();
+            });
+        },
+      } 
+  };
+  </script>
+  
+<style>
+.baseinfoClass {
+    margin-left: 4vw;
+}
+.text-with-line {
+    position: relative;
+    font-size: 16px;
+    color: #333;
+    padding-bottom: 5px; /* 确保条线在文字下方 */
+}
+.text-with-line::after {
+    content: '';
+    position: absolute;
+    left: 0;
+    bottom: 0;
+    width: 100%; /* 条线的宽度 */
+    height: 2px; /* 条线的高度 */
+    background: #000; /* 条线的颜色 */
+}
+.container {
+    display: flex;
+    justify-content: flex-end; /* 这会把子元素放在容器的右边 */
+}  
+.button-container {
+  position: fixed;  /* 使用fixed定位,使得容器始终相对于浏览器窗口 */
+  top: 10px;        /* 距离顶部10像素 */
+  right: 60px;      /* 距离右侧10像素 */
+  z-index: 1000;    /* 设置一个较高的z-index确保按钮在其他内容之上 */
+} 
+.downfile {
+    color:blue;
+    position: relative;
+    text-decoration: none;
+}
+.downfile::after {
+  content: '';
+  position: absolute;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  height: 1px; /* 下划线厚度 */
+  background: blue; /* 下划线颜色 */
+  width: 100%;
+}
+</style>

+ 116 - 0
src/views/material/extend/qualifications.vue

@@ -0,0 +1,116 @@
+<template>
+  <div class="app-container">
+    <el-form ref="form" :model="form" :rules="rules" class="baseinfoClass" >
+        <el-form-item style="margin-left: -3vw;">
+            <div class="text-with-line">资质信息</div>
+        </el-form-item> 
+        <el-table
+            :data="submitQualificationsData"
+            highlight-current-row
+            style="width: 100%; margin-left: -2vw; text-align: center;">
+            <el-table-column
+                type="index"
+                width="50">
+                </el-table-column>
+            <el-table-column
+              property="key"
+              label="资质名称"
+              width="240">
+              </el-table-column>
+            <el-table-column
+              property="value"
+              label="证件号"
+              >
+              </el-table-column>
+        </el-table>
+    </el-form> 
+  </div>
+</template>  
+
+<script>
+import { getMaterialQualifications } from "@/api/material/extend/material.js";
+export default {
+    name: "MaterialQualifications",
+    props: {
+      materialId:{
+        type: String,
+        default: ''
+      }
+    },
+    data() {
+      return {
+        // 表单参数
+        form: {},
+        // 表单校验
+        rules: {},
+        submitQualificationsData: [
+          {id:2,key:'注册人/上市许可持有人',value:''},
+          {id:3,key:'DI',value:''},
+          {id:4,key:'医保代码',value:''},
+          {id:5,key:'生产许可证',value:''},
+          {id:6,key:'注册证号',value:''},
+        ],
+      };
+    },
+    created() {
+      this.getDetailQualifications();
+    },
+    methods: {
+      getDetailQualifications() {
+        getMaterialQualifications(this.materialId).then(response => {
+          if(response.data != undefined){
+            this.submitQualificationsData.forEach(element => {
+              if(element.id == 2){
+                this.$set(element,'value',response.data.createMan)
+              }
+              if(element.id == 3){
+                this.$set(element,'value',response.data.diCode)
+              }
+              if(element.id == 4){
+                this.$set(element,'value','/')
+              }
+              if(element.id == 5){
+                this.$set(element,'value',response.data.vproducelic)
+              } 
+              if(element.id == 6){
+                this.$set(element,'value',response.data.vregistrationno)
+              }
+            });
+          }
+        });
+      },
+    }
+};
+</script>
+
+<style>
+    .baseinfoClass {
+        margin-left: 4vw;
+    }
+    .text-with-line {
+        position: relative;
+        font-size: 16px;
+        color: #333;
+        padding-bottom: 5px; /* 确保条线在文字下方 */
+    }
+    .text-with-line::after {
+        content: '';
+        position: absolute;
+        left: 0;
+        bottom: 0;
+        width: 100%; /* 条线的宽度 */
+        height: 2px; /* 条线的高度 */
+        background: #000; /* 条线的颜色 */
+    }
+    .container {
+        display: flex;
+        justify-content: flex-end; /* 这会把子元素放在容器的右边 */
+    }  
+    .button-container {
+      position: fixed;  /* 使用fixed定位,使得容器始终相对于浏览器窗口 */
+      top: 10px;        /* 距离顶部10像素 */
+      right: 60px;      /* 距离右侧10像素 */
+      z-index: 1000;    /* 设置一个较高的z-index确保按钮在其他内容之上 */
+    } 
+</style>
+  

+ 132 - 0
src/views/material/extend/sale.vue

@@ -0,0 +1,132 @@
+<template>
+  <div class="app-container">
+    <el-form ref="form" :model="form" :rules="rules" class="baseinfoClass" >
+        <el-form-item style="margin-left: -3vw;">
+            <div class="text-with-line">三级甲等</div>
+        </el-form-item> 
+        <el-table
+            :data="submitSaleData1"
+            highlight-current-row
+            style="width: 100%; margin-left: -2vw; text-align: center;">
+            <el-table-column
+                type="index"
+                width="50">
+                </el-table-column>
+            <el-table-column
+              property="name"
+              label="医院名称"
+              width="240">
+              </el-table-column>
+            <el-table-column
+              property="news"
+              label="本年销售数量"
+              width="300"
+              >
+              </el-table-column>
+            <el-table-column
+              property="olds"
+              label="上年销售数量"
+              >
+              </el-table-column>
+        </el-table>
+        <el-form-item style="margin-left: -3vw;margin-top: 4vh;">
+            <div class="text-with-line">三级</div>
+        </el-form-item> 
+        <el-table
+            :data="submitSaleData2"
+            highlight-current-row
+            style="width: 100%; margin-left: -2vw; text-align: center;">
+            <el-table-column
+                type="index"
+                width="50">
+                </el-table-column>
+            <el-table-column
+              property="name"
+              label="医院名称"
+              width="240">
+              </el-table-column>
+            <el-table-column
+              property="news"
+              label="本年销售数量"
+              width="300"
+              >
+              </el-table-column>
+            <el-table-column
+              property="olds"
+              label="上年销售数量"
+              >
+              </el-table-column>
+        </el-table>
+    </el-form> 
+  </div>
+</template>  
+
+<script>
+import { getSaleRankGrade, getSaleRank } from "@/api/material/extend/material.js";
+export default {
+    name: "MaterialSale",
+    props: {
+      materialId:{
+        type: String,
+        default: ''
+      }
+    },
+    data() {
+      return {
+        // 表单参数
+        form: {},
+        // 表单校验
+        rules: {},
+        submitSaleData1: [
+        ],
+        submitSaleData2: [
+        ],
+      };
+    },
+    created() {
+      this.getDetailSale();
+    },
+    methods: {
+      getDetailSale() {
+        getSaleRankGrade(this.materialId).then(response => {
+          this.submitSaleData1 = response.data
+        });
+        getSaleRank(this.materialId).then(response => {
+          this.submitSaleData2 = response.data
+        });
+      },
+    }
+};
+</script>
+
+<style>
+    .baseinfoClass {
+        margin-left: 4vw;
+    }
+    .text-with-line {
+        position: relative;
+        font-size: 16px;
+        color: #333;
+        padding-bottom: 5px; /* 确保条线在文字下方 */
+    }
+    .text-with-line::after {
+        content: '';
+        position: absolute;
+        left: 0;
+        bottom: 0;
+        width: 100%; /* 条线的宽度 */
+        height: 2px; /* 条线的高度 */
+        background: #000; /* 条线的颜色 */
+    }
+    .container {
+        display: flex;
+        justify-content: flex-end; /* 这会把子元素放在容器的右边 */
+    }  
+    .button-container {
+      position: fixed;  /* 使用fixed定位,使得容器始终相对于浏览器窗口 */
+      top: 10px;        /* 距离顶部10像素 */
+      right: 60px;      /* 距离右侧10像素 */
+      z-index: 1000;    /* 设置一个较高的z-index确保按钮在其他内容之上 */
+    } 
+</style>
+  

Разлика између датотеке није приказан због своје велике величине
+ 308 - 309
src/views/material/requisition/details/columns.js


+ 50 - 20
src/views/purchase/PurchaseDemandList/add.vue

@@ -20,10 +20,10 @@
                 trigger: 'blur',
               }"
             >
+              <!-- @change="changeBillType(basicForm.billType)" -->
               <el-select
                 clearable
                 v-model="basicForm.billType"
-                @change="changeBillType(basicForm.billType)"
                 :disabled="sonDisable"
                 :size="size"
                 style="width: 200px"
@@ -209,6 +209,19 @@
             </el-form-item>
           </el-col>
 
+          <el-col :span="1.5">
+            <el-form-item label="OA新品单号">
+              <el-input
+                v-model="basicForm.newProductCode"
+                :size="size"
+                :disabled="sonDisable"
+                placeholder="填写OA新品/新供应商单据号"
+                clearable
+                style="width: 200px"
+              />
+            </el-form-item>
+          </el-col>
+
           <!-- <el-col :span="1.5">
             <el-form-item label="需求客户名称">
               <el-input disabled v-model="basicForm.customerName" :size="size" style="width: 200px"></el-input>
@@ -1446,6 +1459,7 @@ export default {
         isMonthleyCalculate: "",
         createTime: this.parseTime(new Date().getTime()),
         remark: "",
+        newProductCode: null,
         puDemandItemList: [],
       },
       delDemandItemList: [],
@@ -1621,6 +1635,11 @@ export default {
     };
   },
   watch: {
+    "basicForm.billType": {
+      handler(nVal, oVal) {
+        this.changeBillType(nVal);
+      },
+    },
     // "basicForm.demandDate": {
     //   handler(nVal, oVal) {
     //     if (nVal && nVal !== "") {
@@ -2489,7 +2508,8 @@ export default {
                 // 删除指定下标
                 this.basicForm.puDemandItemList.splice(
                   index,
-                  this.basicForm.puDemandItemList.length - index,
+                  newLine.length,
+                  // this.basicForm.puDemandItemList.length - index,
                   ...newLine
                 );
                 this.$modal.notifySuccess("共粘贴" + rowList.length + "条数据");
@@ -2519,7 +2539,8 @@ export default {
             // 删除指定下标
             this.basicForm.puDemandItemList.splice(
               index,
-              this.basicForm.puDemandItemList.length - index,
+              newLine.length,
+              // this.basicForm.puDemandItemList.length - index,
               ...newLine
             );
             this.$modal.notifySuccess("共粘贴" + rows.length + "条数据");
@@ -2531,7 +2552,8 @@ export default {
               i < this.basicForm.puDemandItemList.length;
               i++, j++
             ) {
-              this.basicForm.puDemandItemList[i].qty = rows[j];
+              this.basicForm.puDemandItemList[i].qty =
+                rows[j] || this.basicForm.puDemandItemList[i].qty;
             }
             this.$refs.table.doLayout();
             this.$modal.closeLoading();
@@ -2561,7 +2583,8 @@ export default {
                   // 删除指定下标
                   this.basicForm.puDemandItemList.splice(
                     index,
-                    this.basicForm.puDemandItemList.length - index,
+                    // this.basicForm.puDemandItemList.length - index,
+                    newLine.length,
                     ...newLine
                   );
                   this.$modal.notifySuccess(
@@ -2573,10 +2596,14 @@ export default {
                     i < this.basicForm.puDemandItemList.length;
                     i++, j++
                   ) {
-                    this.basicForm.puDemandItemList[i].additionalSupplier =
-                      newLine[j].additionalSupplier;
-                    this.basicForm.puDemandItemList[i].additionalSupplierName =
-                      newLine[j].additionalSupplierName;
+                    if (newLine[j].additionalSupplier) {
+                      this.basicForm.puDemandItemList[i].additionalSupplier =
+                        newLine[j].additionalSupplier;
+                      this.basicForm.puDemandItemList[
+                        i
+                      ].additionalSupplierName =
+                        newLine[j].additionalSupplierName;
+                    }
                   }
                   this.$refs.table.doLayout();
                   this.$modal.closeLoading();
@@ -2616,7 +2643,8 @@ export default {
                   // 删除指定下标
                   this.basicForm.puDemandItemList.splice(
                     index,
-                    this.basicForm.puDemandItemList.length - index,
+                    // this.basicForm.puDemandItemList.length - index,
+                    newLine.length,
                     ...newLine
                   );
                   this.$modal.notifySuccess(
@@ -2628,16 +2656,18 @@ export default {
                     i < this.basicForm.puDemandItemList.length;
                     i++, j++
                   ) {
-                    this.basicForm.puDemandItemList[i].deliveryAddressName =
-                      newLine[j].deliveryAddressName;
-                    this.basicForm.puDemandItemList[i].deliveryAddress =
-                      newLine[j].deliveryAddress;
-                    this.basicForm.puDemandItemList[i].contacts =
-                      newLine[j].contacts;
-                    this.basicForm.puDemandItemList[i].contactsPhone =
-                      newLine[j].contactsPhone;
-                    this.basicForm.puDemandItemList[i].address =
-                      newLine[j].address;
+                    if (newLine[j].deliveryAddress) {
+                      this.basicForm.puDemandItemList[i].deliveryAddressName =
+                        newLine[j].deliveryAddressName;
+                      this.basicForm.puDemandItemList[i].deliveryAddress =
+                        newLine[j].deliveryAddress;
+                      this.basicForm.puDemandItemList[i].contacts =
+                        newLine[j].contacts;
+                      this.basicForm.puDemandItemList[i].contactsPhone =
+                        newLine[j].contactsPhone;
+                      this.basicForm.puDemandItemList[i].address =
+                        newLine[j].address;
+                    }
                   }
                   this.$refs.table.doLayout();
                   this.$modal.closeLoading();

+ 20 - 16
src/views/purchase/apply/add/columns.js

@@ -275,13 +275,17 @@ export default function useColumns() {
           },
         },
         {
-          item: { key: "isPriceAdjustmentName", title: "调价类型" },
+          item: { key: "isPriceAdjustment", title: "调价类型" },
           attr: {
-            value: '无',
-            formatter: (prop) => {
-              const { priceDiffer } = prop;
-              return (prop.isPriceAdjustment = priceDiffer > 0 ? '涨价' : priceDiffer < 0 ? '降价' : '无');
-            },
+            value: 'no',
+            is: "el-select",
+            dictName: "price_adjustment_type",
+            disabled: true,
+            // value: '无',
+            // formatter: (prop) => {
+            //   const { priceDiffer } = prop;
+            //   return (prop.isPriceAdjustment = priceDiffer > 0 ? '涨价' : priceDiffer < 0 ? '降价' : '无');
+            // },
           },
         },
         {
@@ -453,16 +457,16 @@ export default function useColumns() {
         },
         // { item: { key: "createByName", title: "创建人名称" }, attr: {} },
         // { item: { key: "updateByName", title: "更新人名称" }, attr: {} },
-        {
-          item: { key: "isPriceAdjustment", title: "", width: 10 },
-          attr: {
-            value: 'no',
-            // formatter: (prop) => {
-            //   const { priceDiffer } = prop;
-            //   return (prop.isPriceAdjustment = priceDiffer > 0 ? 'up' : priceDiffer < 0 ? 'down' : 'no');
-            // },
-          },
-        },
+        // {
+        //   item: { key: "isPriceAdjustment", title: "", width: 10 },
+        //   attr: {
+        //     value: 'no',
+        //     // formatter: (prop) => {
+        //     //   const { priceDiffer } = prop;
+        //     //   return (prop.isPriceAdjustment = priceDiffer > 0 ? 'up' : priceDiffer < 0 ? 'down' : 'no');
+        //     // },
+        //   },
+        // },
         // 采购换算率隐藏
         {
           item: { key: "conversionRate", title: "", required: true, width: 5 },

+ 39 - 1
src/views/purchase/apply/add/index.vue

@@ -1,7 +1,12 @@
 <script>
 import useColumns from "./columns";
 import { EXIST } from "@/api/business/purchase/catalogue";
-import { SAVE, PRICE, BATCHPRICE } from "@/api/business/purchase/apply";
+import {
+  SAVE,
+  PRICE,
+  BATCHPRICE,
+  BATCHPRICEISEXIST,
+} from "@/api/business/purchase/apply";
 import { tax, unit, currency } from "@/components/popover-select-v2/fetch";
 // 用于回显参照框数据
 import { getRefer } from "@/api/purchase/basic.js";
@@ -529,6 +534,29 @@ export default {
         this.loading = false;
       }
     },
+    // 供应商改变
+    async changeSupplierName(prop) {
+      const { priceApplyItems, puOrg, supplier } = this.params;
+      if (priceApplyItems.length) {
+        try {
+          this.loading = true;
+          const params = {
+            priceVoItems: [...priceApplyItems],
+            puOrg,
+            supplier,
+          };
+          let { code, data } = await BATCHPRICEISEXIST({
+            ...params,
+          });
+          if (code === 200) {
+            this.params.priceApplyItems = data;
+          }
+        } catch (error) {
+        } finally {
+          this.loading = false;
+        }
+      }
+    },
   },
   created() {},
   mounted() {},
@@ -572,6 +600,16 @@ export default {
         label-position="right"
         style="padding: 18px"
       >
+        <template slot="supplierName" slot-scope="scope">
+          <component
+            v-bind="scope.attr"
+            v-model="scope.row[scope.item.key]"
+            :size="$attrs.size"
+            :source.sync="scope.row"
+            @change="changeSupplierName(scope.row)"
+          >
+          </component>
+        </template>
       </el-super-form>
       <el-tabs v-model="tabName" style="padding: 0 18px 18px">
         <el-tab-pane

+ 21 - 17
src/views/purchase/apply/copy/columns.js

@@ -275,13 +275,17 @@ export default function useColumns() {
           },
         },
         {
-          item: { key: "isPriceAdjustmentName", title: "调价类型" },
+          item: { key: "isPriceAdjustment", title: "调价类型" },
           attr: {
-            value: '无',
-            formatter: (prop) => {
-              const { priceDiffer } = prop;
-              return (prop.isPriceAdjustment = priceDiffer > 0 ? '涨价' : priceDiffer < 0 ? '降价' : '无');
-            },
+            value: 'no',
+            is: "el-select",
+            dictName: "price_adjustment_type",
+            disabled: true,
+            // value: '无',
+            // formatter: (prop) => {
+            //   const { priceDiffer } = prop;
+            //   return (prop.isPriceAdjustment = priceDiffer > 0 ? '涨价' : priceDiffer < 0 ? '降价' : '无');
+            // },
           },
         },
         {
@@ -454,17 +458,17 @@ export default function useColumns() {
         },
         // { item: { key: "createByName", title: "创建人名称" }, attr: {} },
         // { item: { key: "updateByName", title: "更新人名称" }, attr: {} },
-        {
-          // 调价类型
-          item: { key: "isPriceAdjustment", title: "", width: 10 },
-          attr: {
-            value: 'no',
-            // formatter: (prop) => {
-            //   const { priceDiffer } = prop;
-            //   return (prop.isPriceAdjustment = priceDiffer > 0 ? 'up' : priceDiffer < 0 ? 'down' : 'no');
-            // },
-          },
-        },
+        // {
+        //   // 调价类型
+        //   item: { key: "isPriceAdjustment", title: "", width: 10 },
+        //   attr: {
+        //     value: 'no',
+        //     // formatter: (prop) => {
+        //     //   const { priceDiffer } = prop;
+        //     //   return (prop.isPriceAdjustment = priceDiffer > 0 ? 'up' : priceDiffer < 0 ? 'down' : 'no');
+        //     // },
+        //   },
+        // },
         // 采购换算率隐藏
         {
           item: { key: "conversionRate", title: "采购换算率", required: true, width: 5 },

+ 34 - 1
src/views/purchase/apply/copy/index.vue

@@ -1,7 +1,7 @@
 <script>
 import useColumns from "./columns";
 import { EXIST } from "@/api/business/purchase/catalogue";
-import { ITEM, SAVE, PRICE, BATCHPRICE } from "@/api/business/purchase/apply";
+import { ITEM, SAVE, PRICE, BATCHPRICE,BATCHPRICEISEXIST } from "@/api/business/purchase/apply";
 import { tax, unit, currency } from "@/components/popover-select-v2/fetch";
 // 用于回显参照框数据
 import { getRefer } from "@/api/purchase/basic.js";
@@ -582,6 +582,29 @@ export default {
         this.loading = false;
       }
     },
+    // 供应商改变
+    async changeSupplierName(prop) {
+      const { priceApplyItems, puOrg, supplier } = this.params;
+      if (priceApplyItems.length) {
+        try {
+          this.loading = true;
+          const params = {
+            priceVoItems: [...priceApplyItems],
+            puOrg,
+            supplier,
+          };
+          let { code, data } = await BATCHPRICEISEXIST({
+            ...params,
+          });
+          if (code === 200) {
+            this.params.priceApplyItems = data;
+          }
+        } catch (error) {
+        } finally {
+          this.loading = false;
+        }
+      }
+    },
   },
   created() {},
   mounted() {},
@@ -630,6 +653,16 @@ export default {
         label-position="right"
         style="padding: 18px"
       >
+      <template slot="supplierName" slot-scope="scope">
+          <component
+            v-bind="scope.attr"
+            v-model="scope.row[scope.item.key]"
+            :size="$attrs.size"
+            :source.sync="scope.row"
+            @change="changeSupplierName(scope.row)"
+          >
+          </component>
+        </template>
       </el-super-form>
       <el-tabs v-model="tabName" style="padding: 0 18px 18px">
         <el-tab-pane

+ 20 - 16
src/views/purchase/apply/edit/columns.js

@@ -275,13 +275,17 @@ export default function useColumns() {
           },
         },
         {
-          item: { key: "isPriceAdjustmentName", title: "调价类型" },
+          item: { key: "isPriceAdjustment", title: "调价类型" },
           attr: {
-            value: '无',
-            formatter: (prop) => {
-              const { priceDiffer } = prop;
-              return (prop.isPriceAdjustment = priceDiffer > 0 ? '涨价' : priceDiffer < 0 ? '降价' : '无');
-            },
+            value: 'no',
+            is: "el-select",
+            dictName: "price_adjustment_type",
+            disabled: true,
+            // value: '无',
+            // formatter: (prop) => {
+            //   const { priceDiffer } = prop;
+            //   return (prop.isPriceAdjustment = priceDiffer > 0 ? '涨价' : priceDiffer < 0 ? '降价' : '无');
+            // },
           },
         },
         {
@@ -454,16 +458,16 @@ export default function useColumns() {
         },
         // { item: { key: "createByName", title: "创建人名称" }, attr: {} },
         // { item: { key: "updateByName", title: "更新人名称" }, attr: {} },
-        {
-          item: { key: "isPriceAdjustment", title: "", width: 10 },
-          attr: {
-            value: 'no',
-            // formatter: (prop) => {
-            //   const { priceDiffer } = prop;
-            //   return (prop.isPriceAdjustment = priceDiffer > 0 ? 'up' : priceDiffer < 0 ? 'down' : 'no');
-            // },
-          },
-        },
+        // {
+        //   item: { key: "isPriceAdjustment", title: "", width: 10 },
+        //   attr: {
+        //     value: 'no',
+        //     // formatter: (prop) => {
+        //     //   const { priceDiffer } = prop;
+        //     //   return (prop.isPriceAdjustment = priceDiffer > 0 ? 'up' : priceDiffer < 0 ? 'down' : 'no');
+        //     // },
+        //   },
+        // },
         // 采购换算率隐藏
         {
           item: { key: "conversionRate", title: "采购换算率", required: true, width: 5 },

+ 40 - 1
src/views/purchase/apply/edit/index.vue

@@ -1,7 +1,13 @@
 <script>
 import useColumns from "./columns";
 import { EXIST } from "@/api/business/purchase/catalogue";
-import { ITEM, SAVE, PRICE, BATCHPRICE } from "@/api/business/purchase/apply";
+import {
+  ITEM,
+  SAVE,
+  PRICE,
+  BATCHPRICE,
+  BATCHPRICEISEXIST,
+} from "@/api/business/purchase/apply";
 import { tax, unit, currency } from "@/components/popover-select-v2/fetch";
 // 用于回显参照框数据
 import { getRefer } from "@/api/purchase/basic.js";
@@ -596,6 +602,29 @@ export default {
         this.loading = false;
       }
     },
+    // 供应商改变
+    async changeSupplierName(prop) {
+      const { priceApplyItems, puOrg, supplier } = this.params;
+      if (priceApplyItems.length) {
+        try {
+          this.loading = true;
+          const params = {
+            priceVoItems: [...priceApplyItems],
+            puOrg,
+            supplier,
+          };
+          let { code, data } = await BATCHPRICEISEXIST({
+            ...params,
+          });
+          if (code === 200) {
+            this.params.priceApplyItems = data;
+          }
+        } catch (error) {
+        } finally {
+          this.loading = false;
+        }
+      }
+    },
   },
   created() {},
   mounted() {},
@@ -644,6 +673,16 @@ export default {
         label-position="right"
         style="padding: 18px"
       >
+        <template slot="supplierName" slot-scope="scope">
+          <component
+            v-bind="scope.attr"
+            v-model="scope.row[scope.item.key]"
+            :size="$attrs.size"
+            :source.sync="scope.row"
+            @change="changeSupplierName(scope.row)"
+          >
+          </component>
+        </template>
       </el-super-form>
       <el-tabs v-model="tabName" style="padding: 0 18px 18px">
         <el-tab-pane

+ 7 - 5
src/views/purchase/apply/see/columns.js

@@ -170,8 +170,10 @@ export default function useColumns() {
           },
         },
         {
-          item: { width: 100, key: "isPriceAdjustmentName", title: "调价类型" },
+          item: { width: 100, key: "isPriceAdjustment", title: "调价类型" },
           attr: {
+            is: "el-dict-tag",
+            dictName: "price_adjustment_type",
           },
         },
         {
@@ -187,10 +189,10 @@ export default function useColumns() {
         {
           item: { width: 100, key: "increase", title: "涨幅(%)" },
           attr: {
-            formatter: (prop) => {
-              const { priceDiffer = 0, recentlyPrice = 0 } = prop;
-              return (prop.increase = recentlyPrice ? ((Number(priceDiffer) / Number(recentlyPrice)) * 100).toFixed(1) + '%' : "0%");
-            },
+            // formatter: (prop) => {
+            //   const { priceDiffer = 0, recentlyPrice = 0 } = prop;
+            //   return (prop.increase = recentlyPrice ? ((Number(priceDiffer) / Number(recentlyPrice)) * 100).toFixed(1) + '%' : "0%");
+            // },
           },
         },
 

+ 14 - 2
src/views/purchase/purchase-order/add/column.js

@@ -343,7 +343,13 @@ const PurColumns = [
     title: "OA需求单号",
     inputType: "Input",
     isShow: true,
-
+  },
+  {
+    key: "newProductCode",
+    title: "OA新品流程单据号",
+    inputType: "Input",
+    // placeholder: "",
+    isShow: true,
   },
 
   {
@@ -1179,7 +1185,13 @@ const CauseColumns = [
     title: "OA需求单号",
     inputType: "Input",
     isShow: true,
-
+  },
+  {
+    key: "newProductCode",
+    title: "OA新品流程单据号",
+    inputType: "Input",
+    // placeholder: "",
+    isShow: true,
   },
   {
     key: "remark",

+ 7 - 4
src/views/purchase/purchase-order/index.vue

@@ -338,9 +338,10 @@ export default {
             checkAmount: true,
           });
 
-          if (code == 200) {
-            _this.handleRefreshList();
-          } else if (code == 10000) {
+          // if (code == 200) {
+          //   _this.handleRefreshList();
+          // } else
+          if (code == 10000) {
             _this.$alert(
               "<div style='overflow: auto;overflow-x: hidden;max-height: 65vh;padding: 10px 20px 0;'>" +
                 msg +
@@ -379,6 +380,7 @@ export default {
         } catch (error) {
         } finally {
           this.loading = false;
+          _this.handleRefreshList();
         }
       });
     },
@@ -475,7 +477,8 @@ export default {
             (source.status == "0" ||
               source.status == "3" ||
               source.status == "9") &&
-            source.source == "3" &&
+            source.source != "1" &&
+            source.source != "2" &&
             source.isEnd === "N"
           );
         case "submit":

+ 13 - 10
src/views/purchase/workSpace/columns.js

@@ -81,7 +81,7 @@ export default function useColumns() {
       item: { title: "紧急标识", key: "isUrgency", width: 80, },
       attr: {
         is: "el-dict-tag",
-        dictName: "sys_number_yes_no",
+        dictName: "sys_yes_no",
       },
     },
     {
@@ -90,7 +90,7 @@ export default function useColumns() {
       },
       attr: {
         is: "el-dict-tag",
-        dictName: "sys_number_yes_no",
+        dictName: "sys_yes_no",
       }
     },
   ].map(({ item, attr }) => ({
@@ -475,7 +475,7 @@ export default function useColumns() {
       attr: {}
     },
     {
-      item: { title: "税率", key: "tax" },
+      item: { title: "税率(%)", key: "tax" },
       attr: {}
     },
     {
@@ -493,12 +493,15 @@ export default function useColumns() {
       },
       attr: {
         is: "el-dict-tag",
-        dictName: "sys_number_yes_no",
+        dictName: "sys_yes_no",
       },
     },
     {
       item: { title: "调整类型", key: "isPriceAdjustment" },
-      attr: {}
+      attr: {
+        is: "el-dict-tag",
+        dictName: "price_adjustment_type",
+      }
     },
     {
       item: { title: "最近价格", key: "recentlyPrice", width: 80 },
@@ -509,15 +512,15 @@ export default function useColumns() {
       attr: {}
     },
     {
-      item: { title: "涨幅", key: "increase" },
+      item: { title: "涨幅(%)", key: "increase" },
       attr: {}
     },
     {
-      item: { title: "预计年采购量", key: "yPurchaseQuantity" },
+      item: { title: "预计年采购量", key: "ypurchaseQuantity" },
       attr: {}
     },
     {
-      item: { title: "预计年影响金额", key: "yAffectedAmount" },
+      item: { title: "预计年影响金额", key: "yaffectedAmount" },
       attr: {}
     },
     {
@@ -614,7 +617,7 @@ export default function useColumns() {
       attr: {}
     },
     {
-      item: { title: "税率", key: "tax" },
+      item: { title: "税率(%)", key: "tax" },
       attr: {}
     },
     {
@@ -625,7 +628,7 @@ export default function useColumns() {
       },
       attr: {
         is: "el-dict-tag",
-        dictName: "sys_number_yes_no",
+        dictName: "sys_yes_no",
       },
     },
     {

+ 3 - 2
vue.config.js

@@ -37,7 +37,7 @@ module.exports = {
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
         target: ` http://dev-sy.derom.com/drp-admin`, //开发
-        // target: `http://test-sy.derom.com/drp-admin`, //测试
+        //  target: `http://test-sy.derom.com/drp-admin`, //测试
         // target: `http://release-sy.derom.com/drp-admin`, //预发
         // target: `http://sy.derom.com/drp-admin`, //生产
         // target: `http://172.16.63.202:8000/drp-admin`, // D本地
@@ -47,8 +47,9 @@ module.exports = {
         // target: `http://172.16.13.21:8000/drp-admin`, //CKF本地
         // target: `http://172.16.61.99:8000/drp-admin`, //lz's localhost
         // target: `http://172.16.13.30:8000/drp-admin`, //dz's localhost
-        //  target: `http://127.0.0.1:8000/drp-admin`,
+        // target: `http://127.0.0.1:8000/drp-admin`,
         // target: 'http://172.16.62.148:8000/drp-admin', //tkf本地
+        // target: 'http://172.16.60.219:8000/drp-admin', //
         changeOrigin: true,
         pathRewrite: {
           ["^" + process.env.VUE_APP_BASE_API]: "",

Неке датотеке нису приказане због велике количине промена