ymz 4 miesięcy temu
rodzic
commit
959bdc8161

BIN
dist.zip


+ 17 - 0
src/api/assignPoints/currency/index.js

@@ -330,3 +330,20 @@ export function getPkgTaskDetailsApi(query) {
     params: query
   });
 }
+
+// 获取移交对象列表
+export function getUserV2ListApi() {
+  return request({
+    url: `/admin/user/v2/list`,
+    method: 'get'
+  });
+}
+
+// 提交移交对象
+export function pkgOwnerReplaceApi(data) {
+  return request({
+    url: `/admin/pkg/owner/replace`,
+    method: 'post',
+    data
+  });
+}

+ 185 - 150
src/views/admin/assignPoints/quota/taskCenter.vue

@@ -24,18 +24,14 @@
         </el-date-picker>
       </template>
       <template slot="menuLeft">
-        <el-button type="primary" icon="el-icon-plus" size="small" @click.stop="addData()">
-          新增
-        </el-button>
+        <el-button type="primary" icon="el-icon-plus" size="small" @click.stop="addData()"> 新增 </el-button>
         <!-- <el-button type="primary" icon="el-icon-upload2" size="small" @click.stop="importPakageFn">
           导入积分包
         </el-button> -->
       </template>
       <template slot="menuRight">
         <el-checkbox v-model="toApproval" @change="toApprovalClick" class="checkbox">只看待审核</el-checkbox>
-        <el-button type="primary" :loading="exportFnLoading" icon="el-icon-download" size="small" @click.stop="exportFn">
-          导出数据
-        </el-button>
+        <el-button type="primary" :loading="exportFnLoading" icon="el-icon-download" size="small" @click.stop="exportFn"> 导出数据 </el-button>
       </template>
 
       <template slot="scorePackageName1" slot-scope="scope">
@@ -111,6 +107,7 @@
           </template>
           <el-button type="text" size="small" icon="el-icon-view" @click="toView(scope.row, scope.index)">查看 </el-button>
           <el-button type="text" size="small" icon="el-icon-view" @click="detailFn(scope.row, scope.index)">详情 </el-button>
+          <el-button type="text" size="small" icon="el-icon-user" @click="handoverFn(scope.row, scope.index)">移交 </el-button>
         </template>
       </template>
     </avue-crud>
@@ -251,7 +248,7 @@
                 ref="dismantleTableRef"
                 :propsTableData="pkgTaskTypeQtyList"
                 @updateScope="
-                  val => {
+                  (val) => {
                     pointsForm.score = val;
                   }
                 "
@@ -283,9 +280,7 @@
 
     <!-- 核对积分包信息 -->
     <el-dialog title="核对积分包信息" :visible.sync="reviewPakageDialog" top="30vh" width="440px" @close="reviewPakageClose" center>
-      <div class="attention">
-        较上次填写信息变化字段:“接单对象类型”,“结算渠道”,“XXX”。请确认无误后点击“确定”
-      </div>
+      <div class="attention">较上次填写信息变化字段:“接单对象类型”,“结算渠道”,“XXX”。请确认无误后点击“确定”</div>
       <span slot="footer" class="dialog-footer">
         <el-button @click="reviewPakageClose">取 消</el-button>
         <el-button type="primary" :loading="buttonLoading" @click="importPakageSubmitBtn('importPakageForm')">确 定</el-button>
@@ -297,18 +292,10 @@
       <div><br /></div>
       <div>填表说明:</div>
       <div>1、执行包名称不能重复</div>
-      <div>
-        2、接单对象类型为“兼职”时接单对象不必填写,“全职”时请填写全职人员姓名
-      </div>
-      <div>
-        3、“关联服务企业”与“关联任务积分包”所填内容必须是系统中已存在的名称,每次批量时需要保持这两个字段唯一,不能出现多个“关联服务企业”或“关联任务积分包”的情况。
-      </div>
-      <div>
-        4、“关联任务积分包”如果有值时,“有效服务类型”无需填写。“关联任务积分包”为'无'时,有效服务类型必须填写,如未填写,默认全部任务类型
-      </div>
-      <div>
-        "有效服务类型"填写举例:1、全部。2、指定某些任务类型。每个任务类型之间用&分隔
-      </div>
+      <div>2、接单对象类型为“兼职”时接单对象不必填写,“全职”时请填写全职人员姓名</div>
+      <div>3、“关联服务企业”与“关联任务积分包”所填内容必须是系统中已存在的名称,每次批量时需要保持这两个字段唯一,不能出现多个“关联服务企业”或“关联任务积分包”的情况。</div>
+      <div>4、“关联任务积分包”如果有值时,“有效服务类型”无需填写。“关联任务积分包”为'无'时,有效服务类型必须填写,如未填写,默认全部任务类型</div>
+      <div>"有效服务类型"填写举例:1、全部。2、指定某些任务类型。每个任务类型之间用&分隔</div>
       <div><br /></div>
       <el-upload
         ref="upload"
@@ -324,7 +311,7 @@
         class="upload-demo"
       >
         <el-button slot="trigger" size="small" type="primary">选取文件</el-button>
-        <el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload">上传到服务器</el-button>
+        <el-button style="margin-left: 10px" size="small" type="success" @click="submitUpload">上传到服务器</el-button>
       </el-upload>
       <span slot="footer" class="dialog-footer">
         <span style="margin-right: 1080px">上传文件错误项:</span>
@@ -456,9 +443,9 @@
       </template>
       <span slot="footer" class="dialog-footer">
         注意: 1.报告将于24小时之内生成完毕,请注意下载。<br />
-        <i style="margin-left:62px"></i>2.报告汇总为封面+任务数据汇总+任务列表明细。
+        <i style="margin-left: 62px"></i>2.报告汇总为封面+任务数据汇总+任务列表明细。
         <br />
-        <i style="margin-left:10px"></i>3.报告详情为每条任务的任务详情+图片。
+        <i style="margin-left: 10px"></i>3.报告详情为每条任务的任务详情+图片。
       </span>
     </el-dialog>
     <!-- 中止任务 -->
@@ -474,17 +461,13 @@
             </el-form-item>
           </el-col>
         </el-row>
-        <p class="tc" v-if="suspendData.stopStatus === 'NOTHING'" style="color: red;">
-          该积分包中存在本企业或上级企业还未审核的任务,请审核后再进行该操作
-        </p>
+        <p class="tc" v-if="suspendData.stopStatus === 'NOTHING'" style="color: red">该积分包中存在本企业或上级企业还未审核的任务,请审核后再进行该操作</p>
       </el-form>
       <span slot="footer" class="dialog-footer">
         <el-button :type="suspendData.stopStatus === 'NOTHING' ? 'primary' : ''" @click="stopcancelBtn()">
           {{ suspendData.stopStatus === 'NOTHING' ? '确 定' : '取 消' }}
         </el-button>
-        <el-button v-if="suspendData.stopStatus !== 'NOTHING'" type="primary" @click="enableFlagBtn('enableForm')">
-          确 定
-        </el-button>
+        <el-button v-if="suspendData.stopStatus !== 'NOTHING'" type="primary" @click="enableFlagBtn('enableForm')"> 确 定 </el-button>
       </span>
     </el-dialog>
     <!-- 表单-查看有效服务类型 -->
@@ -501,7 +484,7 @@
 
     <!-- 模板上传失败 -->
     <el-dialog title="模板上传失败!" width="600px" :close-on-click-modal="false" @close="importErrorDialogClose" :visible.sync="importErrorDialogShow" center>
-      <avue-crud style="width: 100%;" :data="importErrorTableData" :option="errorOption"> </avue-crud>
+      <avue-crud style="width: 100%" :data="importErrorTableData" :option="errorOption"> </avue-crud>
     </el-dialog>
     <!-- 批量下发积分包提交前确认弹窗 -->
     <el-dialog title="核对积分包信息" width="600px" top="14vh" @close="importConfirmDialog = false" :visible.sync="importConfirmDialog" center>
@@ -520,7 +503,7 @@
       <el-form :model="restartForm" :rules="restartFormRef" ref="restartForm">
         <el-form-item label="截止日期" prop="endTimeValue">
           <el-date-picker
-            style="width:500px"
+            style="width: 500px"
             :picker-options="pickerOptions"
             v-model="restartForm.endTimeValue"
             @input="$forceUpdate()"
@@ -552,16 +535,34 @@
         <el-button type="primary" @click="taskListDialog = false">确 定</el-button>
       </span>
     </el-dialog>
+
+    <!-- 展示当前任务拆分详情 -->
+    <el-dialog title="移交" :visible.sync="handoverDialog" width="45%" center :before-close="handoverClose">
+      <div>
+        <div class="handover-tips">本操作执行后不可撤回,请知悉</div>
+        <el-form :model="handoverForm" :rules="handoverFormRules" ref="handoverFormRef" label-width="100px" class="demo-ruleForm">
+          <el-form-item label="移交至" prop="ownerId">
+            <el-select v-model="handoverForm.ownerId" placeholder="请选择移交对象" class="w100" filterable>
+              <el-option cla v-for="item in userV2List" :label="item.realname" :value="item.userId" :key="item.userId"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-form>
+      </div>
+
+      <span slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="handoverSubmit">确 定</el-button>
+      </span>
+    </el-dialog>
   </div>
 </template>
 
 <script>
 import dismantleTable from './components/dismantleTable.vue';
-import {allotPointsData, importErrorTableOption} from '@/const/crud/assignPoints/quota/index';
+import { allotPointsData, importErrorTableOption } from '@/const/crud/assignPoints/quota/index';
 import fileDownload from 'js-file-download';
-import {tree1, tree2, tree3, tree4, tree5, tree7, plist, pFlist} from '@/const/crud/taskTypeTree/index';
-import {getToken} from '@/util/auth';
-import {wmscorepackage} from '@/api/wmscorepackage';
+import { tree1, tree2, tree3, tree4, tree5, tree7, plist, pFlist } from '@/const/crud/taskTypeTree/index';
+import { getToken } from '@/util/auth';
+import { wmscorepackage } from '@/api/wmscorepackage';
 import {
   getScorePackagePage,
   getRelationScoreList,
@@ -587,25 +588,28 @@ import {
   exportInfoApi,
   restartApi,
   getListAncestorApi,
-  getPkgTaskDetailsApi
+  getPkgTaskDetailsApi,
+  getUserV2ListApi,
+  pkgOwnerReplaceApi
 } from '@/api/assignPoints/currency/index';
 
-import {fetchList} from '@/api/wmdeptbudget/plan.js';
-import {settleById, geSubmitToken, settleSave, settleIssue, settleReIssue, settleSubmit} from '@/api/settle/settle';
-import {selectByScorePackageId} from '@/api/task/taskType';
-import {getSubSelect, getSettleSubSelect} from '@/api/admin/deptSub';
-import {getBatchHistory, batchGeneratePakage, getPackageSn} from '@/api/assignPoints/quota';
+import { fetchList } from '@/api/wmdeptbudget/plan.js';
+import { settleById, geSubmitToken, settleSave, settleIssue, settleReIssue, settleSubmit } from '@/api/settle/settle';
+import { selectByScorePackageId } from '@/api/task/taskType';
+import { getSubSelect, getSettleSubSelect } from '@/api/admin/deptSub';
+import { getBatchHistory, batchGeneratePakage, getPackageSn } from '@/api/assignPoints/quota';
 import store from '@/store';
-import {templateDownload} from '@/api/assignPoints/currency/manList';
-import {getDictType} from '@/api/common';
-import {SUBJECT_TYPE_MAP} from '@/const/auth';
-import {getAvailQuizList} from '@/api/test';
+import { templateDownload } from '@/api/assignPoints/currency/manList';
+import { getDictType } from '@/api/common';
+import { SUBJECT_TYPE_MAP } from '@/const/auth';
+import { getAvailQuizList } from '@/api/test';
 import BigNumber from 'bignumber.js';
+import color from '@/mixins/color';
 
 // BigNumber.config({ ROUNDING_MODE: BigNumber.ROUND_HALF_UP })
 export default {
   name: 'allotPoints',
-  components: {dismantleTable},
+  components: { dismantleTable },
   data() {
     return {
       taskListArr: [],
@@ -661,14 +665,14 @@ export default {
         }
       },
       rules: {
-        scorePackageName: [{required: true, message: '请输入执行包名称', trigger: 'blur'}],
-        score: [{required: true, message: '请输入服务总值', trigger: 'blur'}],
-        relationScoreId: [{required: true, message: '请选择关联任务积分包', trigger: 'change'}],
-        userList: [{required: true, message: '请选择承接对象', trigger: 'change'}],
-        taskTypeList: [{required: true, message: '请选择有效服务类型', trigger: 'input'}],
-        packageUserScope: [{required: true, message: '请选择接单对象范围', trigger: 'change'}],
-        relatedService: [{message: '请选择关联服务企业', trigger: 'change'}],
-        typeid: [{required: true, message: '请选择接单对象类型', trigger: 'change'}]
+        scorePackageName: [{ required: true, message: '请输入执行包名称', trigger: 'blur' }],
+        score: [{ required: true, message: '请输入服务总值', trigger: 'blur' }],
+        relationScoreId: [{ required: true, message: '请选择关联任务积分包', trigger: 'change' }],
+        userList: [{ required: true, message: '请选择承接对象', trigger: 'change' }],
+        taskTypeList: [{ required: true, message: '请选择有效服务类型', trigger: 'input' }],
+        packageUserScope: [{ required: true, message: '请选择接单对象范围', trigger: 'change' }],
+        relatedService: [{ message: '请选择关联服务企业', trigger: 'change' }],
+        typeid: [{ required: true, message: '请选择接单对象类型', trigger: 'change' }]
       },
       restartVisible: false,
       currentRow: {},
@@ -719,7 +723,7 @@ export default {
       enableFlagDig: false,
       enableForm: {},
       enableRule: {
-        enableFlag: [{required: true, message: '请选择积分回收方式', trigger: 'change'}]
+        enableFlag: [{ required: true, message: '请选择积分回收方式', trigger: 'change' }]
       },
       searchForm: {},
       publishDateTime: '', // 发布时间
@@ -777,10 +781,20 @@ export default {
       submitToken: '', // 提交
       availQuizList: [],
       quizList: [], // 测试试卷列表
-      exportFnLoading: false
+      exportFnLoading: false,
+      currentInfo: {},
+      handoverDialog: false,
+      handoverForm: {
+        ownerId: ''
+      },
+      userV2List: [],
+      handoverFormRules: {
+        ownerId: [{ required: true, message: '请选择移交对象', trigger: 'change' }]
+      }
     };
   },
   mounted() {
+    this.getUserV2List();
     // 承接对象类型-展示-默认全职"3""
     this.typeidShow();
     // 获取承接对象 - 全职
@@ -836,7 +850,7 @@ export default {
       templateDownload({
         fileName
       })
-        .then(response => {
+        .then((response) => {
           let url = window.URL.createObjectURL(new Blob([response.data]));
           let link = document.createElement('a');
           link.style.display = 'none';
@@ -856,7 +870,7 @@ export default {
       this.$message.warning('最多上传一个文件!');
     },
     importPakageHandleSuccess(res, file) {
-      this.importPakageFileList = [{name: file.name, url: res.data.url}];
+      this.importPakageFileList = [{ name: file.name, url: res.data.url }];
     },
     importPakageHandleError() {
       this.importPakageFileList = [];
@@ -864,8 +878,8 @@ export default {
     },
     importPakageHandleChange(file, fileList) {
       this.importPakageFile = file.raw;
-      this.importPakageFileList = [{name: file.name}];
-      let existFile = fileList.slice(0, fileList.length - 1).find(f => f.name === file.name); //如果文件名重复
+      this.importPakageFileList = [{ name: file.name }];
+      let existFile = fileList.slice(0, fileList.length - 1).find((f) => f.name === file.name); //如果文件名重复
       if (existFile) {
         this.$message.error('当前文件已经存在!');
         fileList.pop();
@@ -873,11 +887,11 @@ export default {
     },
     // 获取批量下发积分包弹窗的历史记录
     async getBatchHistory() {
-      const {data} = await getBatchHistory();
+      const { data } = await getBatchHistory();
       if (data.code === 0 && data.data && data.data.history) {
         this.importHistory = Object.assign({}, data.data.history);
         this.importPakageForm = data.data.history;
-        this.checkedDsScope = this.importPakageForm.taskTypeList.map(ele => ele.taskTypeId);
+        this.checkedDsScope = this.importPakageForm.taskTypeList.map((ele) => ele.taskTypeId);
         this.setSelectNodes(this.checkedDsScope);
         // 动态展示页面
         if (this.importPakageForm.typeid) this.typeidChange(this.importPakageForm.typeid);
@@ -944,7 +958,7 @@ export default {
       if (this.importPakageFileList.length === 0) {
         return this.$message.warning('请上传模板!');
       }
-      this.$refs[formName].validate(valid => {
+      this.$refs[formName].validate((valid) => {
         if (valid) {
           const date = this.formatDate(this.importPakageForm.endTimeValue);
           this.importPakageForm.endTime = date;
@@ -955,9 +969,9 @@ export default {
           let diffItems = [];
           const diffTaskTypeList = () => {
             if (this.importHistory.taskTypeList.length !== this.importPakageForm.taskTypeList.length) return false;
-            const historyIds = this.importHistory.taskTypeList.map(ele => ele.taskTypeId);
-            const pakageFormIds = this.importPakageForm.taskTypeList.map(ele => ele.taskTypeId);
-            return historyIds.every(ele => pakageFormIds.includes(ele));
+            const historyIds = this.importHistory.taskTypeList.map((ele) => ele.taskTypeId);
+            const pakageFormIds = this.importPakageForm.taskTypeList.map((ele) => ele.taskTypeId);
+            return historyIds.every((ele) => pakageFormIds.includes(ele));
           };
           if (Object.keys(this.importHistory).length) {
             if (this.importHistory.typeid !== this.importPakageForm.typeid) {
@@ -1008,7 +1022,7 @@ export default {
       if (this.idVal != '-1') {
         this.importPakageForm.drugProducerList = this.drugProducerList; // 推广产品企业
         if (!this.importPakageForm.drugtable || this.importPakageForm.drugtable.length === 0) {
-          this.importPakageForm.drugtable = this.drugList.map(item => item.drug_id); // 推广产品企业
+          this.importPakageForm.drugtable = this.drugList.map((item) => item.drug_id); // 推广产品企业
         }
         if (parseInt(this.getScore) > parseInt(this.kfpjfVal)) {
           this.$message.error('服务总值必须小于可分配积分值');
@@ -1020,7 +1034,7 @@ export default {
           this.importPakageForm.drugProducerList = this.drugProducerList; // 推广产品企业
         }
         if (!this.importPakageForm.drugtable || this.importPakageForm.drugtable.length === 0) {
-          this.importPakageForm.drugtable = this.drugList.map(item => item.drug_id); // 推广产品企业
+          this.importPakageForm.drugtable = this.drugList.map((item) => item.drug_id); // 推广产品企业
         }
       }
       if (parseInt(this.getScore) == '0') {
@@ -1041,7 +1055,7 @@ export default {
       );
 
       batchGeneratePakage(importPakageFormData)
-        .then(res => {
+        .then((res) => {
           if (res.data.code === 0) {
             if (res.data.data) {
               this.importErrorTableData = res.data.data;
@@ -1065,7 +1079,7 @@ export default {
     },
     // 推广产品企业
     getDrugProducerList() {
-      getDrugProducerList({deptId: this.$store.getters.userInfo.deptId}).then(res => {
+      getDrugProducerList({ deptId: this.$store.getters.userInfo.deptId }).then((res) => {
         this.drugProducerListCopy = res.data.data;
       });
     },
@@ -1077,14 +1091,14 @@ export default {
     },
     // 关联执行包-展示
     showRelationScore() {
-      getRelationScoreList().then(response => {
+      getRelationScoreList().then((response) => {
         this.getRelationScoreData = response.data.data;
       });
     },
     // 关联服务企业-展示
     getAllParentList() {
-      getListAncestorApi().then(response => {
-        response.data.data.forEach(item => {
+      getListAncestorApi().then((response) => {
+        response.data.data.forEach((item) => {
           const addnew = {
             value: item.deptId + '',
             label: item.name
@@ -1095,8 +1109,8 @@ export default {
     },
     // 承接对象类型-展示
     typeidShow() {
-      typeidPersonal().then(response => {
-        response.data.data.forEach(item => {
+      typeidPersonal().then((response) => {
+        response.data.data.forEach((item) => {
           const addnew = {
             value: item.value,
             label: item.label
@@ -1109,8 +1123,8 @@ export default {
     // 全职-接单对象展示
     showObjectscope() {
       this.receivingObject1 = [];
-      objectScope1().then(response => {
-        response.data.data.forEach(item => {
+      objectScope1().then((response) => {
+        response.data.data.forEach((item) => {
           const addnew = {
             value: item.id,
             label: item.realname + ' ' + item.username
@@ -1159,7 +1173,7 @@ export default {
       let arg = {
         description: '1'
       };
-      getTaskTypeTree(arg).then(response => {
+      getTaskTypeTree(arg).then((response) => {
         // this.pointsForm.taskTypeList = response.data.data.treeList
         if (type == '1') {
           this.checkedDsScope = response.data.data.keys;
@@ -1191,9 +1205,9 @@ export default {
         // 非导入积分包获取历史记录时调用, 清空"关联执行包"
         this.importPakageForm.relationScoreId = '';
       }
-      let arg = {relatedService: id};
+      let arg = { relatedService: id };
       // 根据选择的"关联服务企业", 请求"关联执行包"列表
-      getRelationScoreList(arg).then(response => {
+      getRelationScoreList(arg).then((response) => {
         this.getRelationScoreData = response.data.data;
         /**
          * 导入积分包获取历史记录时
@@ -1202,7 +1216,7 @@ export default {
          */
         if (isHistory) {
           if (Array.isArray(this.getRelationScoreData) && this.getRelationScoreData.length) {
-            if (!this.getRelationScoreData.some(ele => ele.id === this.importPakageForm.relationScoreId)) {
+            if (!this.getRelationScoreData.some((ele) => ele.id === this.importPakageForm.relationScoreId)) {
               this.importPakageForm.relationScoreId = '';
             }
           } else {
@@ -1213,8 +1227,8 @@ export default {
     },
     // 接单对象范围-默认展示
     showUserScope() {
-      packageUserScopeByOpt().then(response => {
-        response.data.data.forEach(item => {
+      packageUserScopeByOpt().then((response) => {
+        response.data.data.forEach((item) => {
           const addnew = {
             value: item.value,
             label: item.label
@@ -1240,7 +1254,7 @@ export default {
           this.searchForm
         )
       )
-        .then(response => {
+        .then((response) => {
           this.tableData = [];
           this.tableData = response.data.data.records;
           this.page.total = response.data.data.total;
@@ -1279,7 +1293,7 @@ export default {
       } else {
         this.packageDisabled = true;
         this.buttonLoading = true;
-        let curr = this.getRelationScoreData.find(item => item.id === id);
+        let curr = this.getRelationScoreData.find((item) => item.id === id);
 
         if (curr) {
           if (curr.endTime && curr.startTime) {
@@ -1332,7 +1346,7 @@ export default {
 
           // this.setSelectNodes(this.checkedDsScope);
           const quizRelations = response.data.data[0].quizRelations || [];
-          this.quizList = quizRelations.map(ele => ({
+          this.quizList = quizRelations.map((ele) => ({
             ...ele,
             quizId: ele.relationId
           }));
@@ -1355,7 +1369,7 @@ export default {
         this.getListDrug();
       } else {
         console.log('getRelationScoreData', this.getRelationScoreData);
-        let curr = this.getRelationScoreData.find(item => item.id === id);
+        let curr = this.getRelationScoreData.find((item) => item.id === id);
         if (curr) {
           this.pointsForm.endTimeValue = curr.endTime;
           this.pointsForm.startTime = curr.startTime;
@@ -1416,7 +1430,7 @@ export default {
     // 新增按钮-展示弹窗
     addData() {
       // 获取执行包编号
-      getPackageSn().then(res => {
+      getPackageSn().then((res) => {
         if (res.data.code === 0) {
           this.dialogType = 'add';
           this.showTit = '新增';
@@ -1452,7 +1466,7 @@ export default {
         id: row.id
       };
 
-      getScorePackagePageById(arg).then(response => {
+      getScorePackagePageById(arg).then((response) => {
         this.showTaskType();
         this.pointsForm = response.data.data;
         this.idVal = this.pointsForm.relationScoreId;
@@ -1500,7 +1514,7 @@ export default {
       this.restartVisible = false;
     },
     restartSubmit() {
-      this.$refs.restartForm.validate(async valid => {
+      this.$refs.restartForm.validate(async (valid) => {
         if (valid) {
           const date = this.formatDate(this.restartForm.endTimeValue);
           const obj = {
@@ -1526,7 +1540,7 @@ export default {
         };
         const response = await getRelationScoreList(arg);
         const quizRelations = response.data.data[0].quizRelations || [];
-        this.quizList = quizRelations.map(ele => ({
+        this.quizList = quizRelations.map((ele) => ({
           ...ele,
           quizId: ele.relationId
         }));
@@ -1580,7 +1594,7 @@ export default {
     },
     // 弹窗-确定按钮
     sureBtn(formName) {
-      this.$refs.pointsForm.validate(valid => {
+      this.$refs.pointsForm.validate((valid) => {
         if (valid) {
           const date = this.formatDate(this.pointsForm.endTimeValue);
           this.pointsForm.endTime = date;
@@ -1602,7 +1616,7 @@ export default {
             }
             if (this.idVal != '-1') {
               if (!this.pointsForm.drugtable || this.pointsForm.drugtable.length === 0) {
-                this.pointsForm.drugtable = this.drugList.map(item => item.drug_id);
+                this.pointsForm.drugtable = this.drugList.map((item) => item.drug_id);
               }
               this.pointsForm.drugProducerList = this.drugProducerList; // 推广产品企业
 
@@ -1616,7 +1630,7 @@ export default {
                 this.pointsForm.drugProducerList = this.drugProducerList; // 推广产品企业
               }
               if (!this.pointsForm.drugtable || this.pointsForm.drugtable.length === 0) {
-                this.pointsForm.drugtable = this.drugList.map(item => item.drug_id);
+                this.pointsForm.drugtable = this.drugList.map((item) => item.drug_id);
               }
             }
 
@@ -1627,7 +1641,7 @@ export default {
             }
             const tableData = this.$refs.dismantleTableRef.getDetail();
             let pkgTaskTypeQtyList;
-            pkgTaskTypeQtyList = tableData.map(item => {
+            pkgTaskTypeQtyList = tableData.map((item) => {
               return {
                 taskTypeName: item.taskTypeName,
                 price: item.score,
@@ -1636,7 +1650,7 @@ export default {
               };
             });
 
-            let flag = this.pkgTaskTypeQtyList.every(item => item.qty == 0);
+            let flag = this.pkgTaskTypeQtyList.every((item) => item.qty == 0);
             if (flag) {
               this.$message.error('请选择具体任务');
               return false;
@@ -1644,7 +1658,7 @@ export default {
             this.pointsForm.pkgTaskTypeQtyList = pkgTaskTypeQtyList;
 
             delete this.pointsForm.drugProducerList;
-            let treeArr = tableData.map(item => {
+            let treeArr = tableData.map((item) => {
               return {
                 taskTypeName: item.taskTypeName,
                 taskTypeId: item.orgTaskTypeId
@@ -1652,8 +1666,8 @@ export default {
             });
 
             let arr1 = [...pFlist];
-            tableData.forEach(item => {
-              const curr = arr1.find(iten => iten.taskTypeId === item.parent_id);
+            tableData.forEach((item) => {
+              const curr = arr1.find((iten) => iten.taskTypeId === item.parent_id);
               if (curr) {
                 curr.children.push({
                   taskTypeId: item.orgTaskTypeId,
@@ -1663,7 +1677,7 @@ export default {
             });
 
             let arr3 = arr1.concat(treeArr);
-            const arr4 = arr3.filter(item => {
+            const arr4 = arr3.filter((item) => {
               if (!item.children || item.children.length > 0) {
                 return item;
               }
@@ -1671,7 +1685,7 @@ export default {
             this.pointsForm.taskTypeList = arr4;
 
             addWmScorePackage(this.pointsForm)
-              .then(response => {
+              .then((response) => {
                 this.$message.success('新增成功');
                 this.cancelBtn();
                 this.buttonLoading = false;
@@ -1700,7 +1714,7 @@ export default {
               return false;
             } else {
               editData(this.pointsForm)
-                .then(response => {
+                .then((response) => {
                   this.cancelBtn();
                   this.buttonLoading = false;
                 })
@@ -1721,7 +1735,7 @@ export default {
     },
     // 弹窗-确定按钮
     sureBtn1(formName) {
-      this.$refs[formName].validate(valid => {
+      this.$refs[formName].validate((valid) => {
         if (valid) {
           const date = this.formatDate(this.pointsForm.endTimeValue);
           this.pointsForm.endTime = date;
@@ -1756,7 +1770,7 @@ export default {
             }
             if (this.idVal != '-1') {
               this.pointsForm.drugProducerList = this.drugProducerList; // 推广产品企业
-              this.pointsForm.drugtable = this.drugList.map(item => item.drug_id);
+              this.pointsForm.drugtable = this.drugList.map((item) => item.drug_id);
               if (parseInt(this.getScore) > parseInt(this.kfpjfVal)) {
                 this.$message.error('服务总值必须小于可分配积分值');
                 this.relationScorechange(this.idVal);
@@ -1767,7 +1781,7 @@ export default {
                 this.pointsForm.drugProducerList = this.drugProducerList; // 推广产品企业
               }
               if (!this.pointsForm.drugList || this.pointsForm.drugList.length === 0) {
-                this.pointsForm.drugtable = this.drugList.map(item => item.drug_id);
+                this.pointsForm.drugtable = this.drugList.map((item) => item.drug_id);
               }
             }
             if (parseInt(this.getScore) == '0') {
@@ -1777,7 +1791,7 @@ export default {
             }
             delete this.pointsForm.drugProducerList;
             addWmScorePackage(this.pointsForm)
-              .then(async response => {
+              .then(async (response) => {
                 this.$message.success('新增成功');
                 this.showDialog = true;
                 this.pointsForm.scorePackageName = '';
@@ -1810,7 +1824,7 @@ export default {
               return false;
             } else {
               editData(this.pointsForm)
-                .then(response => {
+                .then((response) => {
                   this.cancelBtn();
                   this.buttonLoading = false;
                 })
@@ -1836,13 +1850,13 @@ export default {
     },
     // 中止确认按钮
     enableFlagBtn(formName) {
-      this.$refs[formName].validate(valid => {
+      this.$refs[formName].validate((valid) => {
         if (valid) {
           let args = {
             enableType: this.enableForm.enableFlag,
             id: this.suspendData.id
           };
-          updateEnable(args).then(response => {
+          updateEnable(args).then((response) => {
             this.$message.success('终止成功');
             this.getList(this.page);
             this.enableFlagDig = false;
@@ -1924,7 +1938,7 @@ export default {
       if (type === 'word') {
         this.wordLoading = true;
         exportZbReport(obj)
-          .then(response => {
+          .then((response) => {
             if (undefined == response.data || undefined == response.data.data) {
               this.$message.error('导出失败');
               return false;
@@ -1940,7 +1954,7 @@ export default {
       } else if (type === 'excel') {
         this.excelLoading = true;
         exportZbReportExcel(obj)
-          .then(response => {
+          .then((response) => {
             if (undefined == response.data || undefined == response.data.data) {
               this.$message.error('导出失败');
               return false;
@@ -2020,7 +2034,7 @@ export default {
         exportType: 2
       };
       exportZbReport(obj)
-        .then(response => {
+        .then((response) => {
           if (undefined == response.data || undefined == response.data.data) {
             this.$message.error('导出失败');
             return false;
@@ -2080,9 +2094,9 @@ export default {
       // this.taskTypes = row.taskTypes == null ? "无" : row.taskTypes;
       // this.taskTypedialog = true;
 
-      selectByScorePackageId({id: row.id}).then(response => {
+      selectByScorePackageId({ id: row.id }).then((response) => {
         this.taskTypes = response.data.data;
-        this.taskTypes.forEach(item => {
+        this.taskTypes.forEach((item) => {
           item.code = plist[item.code];
         });
         this.taskTypedialog = true;
@@ -2111,7 +2125,7 @@ export default {
     },
     //以下是结算的方法
     getSummaries(param) {
-      const {columns, data} = param;
+      const { columns, data } = param;
       const sums = [];
       columns.forEach((column, index) => {
         if (index === 0) {
@@ -2119,8 +2133,8 @@ export default {
           return;
         }
         if (index === 3 || index === 4) {
-          const values = data.map(item => Number(item[column.property]));
-          if (!values.every(value => isNaN(value))) {
+          const values = data.map((item) => Number(item[column.property]));
+          if (!values.every((value) => isNaN(value))) {
             sums[index] = values.reduce((prev, curr) => {
               const value = Number(curr);
               if (!isNaN(value)) {
@@ -2144,10 +2158,7 @@ export default {
       value = value.replace(/[^\d.\-]/g, ''); //清除"数字"和"." "-"负号以外的字符
       value = value.replace(/^\./g, ''); //验证第一个字符是数字
       value = value.replace(/\.{2,}/g, ''); //只保留第一个, 清除多余的
-      value = value
-        .replace('.', '$#$')
-        .replace(/\./g, '')
-        .replace('$#$', '.');
+      value = value.replace('.', '$#$').replace(/\./g, '').replace('$#$', '.');
       value = value.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3'); //只能输入两个小数
 
       e.discount = value;
@@ -2170,10 +2181,7 @@ export default {
       value = value.replace(/[^\d.\-]/g, ''); //清除"数字"和"." "-"负号以外的字符
       value = value.replace(/^\./g, ''); //验证第一个字符是数字
       value = value.replace(/\.{2,}/g, ''); //只保留第一个, 清除多余的
-      value = value
-        .replace('.', '$#$')
-        .replace(/\./g, '')
-        .replace('$#$', '.');
+      value = value.replace('.', '$#$').replace(/\./g, '').replace('$#$', '.');
       value = value.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3'); //只能输入两个小数
       // if (Number(value) > 2) {
       //   e.discount = 1
@@ -2195,10 +2203,7 @@ export default {
       if (value) {
         value = value.replace(/[^\d.\-]/g, ''); //清除"数字"和"." "-"负号以外的字符
         value = value.replace(/\.{2,}/g, ''); //只保留第一个, 清除多余的
-        value = value
-          .replace('.', '$#$')
-          .replace(/\./g, '')
-          .replace('$#$', '.');
+        value = value.replace('.', '$#$').replace(/\./g, '').replace('$#$', '.');
         value = value.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3'); //只能输入两个小数
 
         let total = Number(this.score) * 1.2;
@@ -2231,10 +2236,7 @@ export default {
       let value = e.settleAmount;
       value = value.replace(/[^\d.\-]/g, ''); //清除"数字"和"." "-"负号以外的字符
       value = value.replace(/\.{2,}/g, ''); //只保留第一个, 清除多余的
-      value = value
-        .replace('.', '$#$')
-        .replace(/\./g, '')
-        .replace('$#$', '.');
+      value = value.replace('.', '$#$').replace(/\./g, '').replace('$#$', '.');
       value = value.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3'); //只能输入两个小数
       let discount = 0;
       let actualAmount = 0;
@@ -2252,10 +2254,7 @@ export default {
       let value = e.actualAmount;
       value = value.replace(/[^\d.\-]/g, ''); //清除"数字"和"." "-"负号以外的字符
       value = value.replace(/\.{2,}/g, ''); //只保留第一个, 清除多余的
-      value = value
-        .replace('.', '$#$')
-        .replace(/\./g, '')
-        .replace('$#$', '.');
+      value = value.replace('.', '$#$').replace(/\./g, '').replace('$#$', '.');
       value = value.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3'); //只能输入两个小数
       let settleAmount = 0;
       let discount = 0;
@@ -2274,10 +2273,7 @@ export default {
       let value = e.actualAmount;
       value = value.replace(/[^\d.\-]/g, ''); //清除"数字"和"." "-"负号以外的字符
       value = value.replace(/\.{2,}/g, ''); //只保留第一个, 清除多余的
-      value = value
-        .replace('.', '$#$')
-        .replace(/\./g, '')
-        .replace('$#$', '.');
+      value = value.replace('.', '$#$').replace(/\./g, '').replace('$#$', '.');
       value = value.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3'); //只能输入两个小数
       let settleAmount = 0;
       let discount = 0;
@@ -2302,7 +2298,7 @@ export default {
           id: id
         };
         settleReIssue(args)
-          .then(response => {
+          .then((response) => {
             this.$message.warning(response.data.msg);
             this.buttonLoading = false;
           })
@@ -2324,7 +2320,7 @@ export default {
         this.$message.error('数据异常');
         return;
       }
-      this.$refs['form'].validate(valid => {
+      this.$refs['form'].validate((valid) => {
         if (valid) {
           for (var i = 0; i < this.gridData.length; i++) {
             const item = this.gridData[i];
@@ -2349,7 +2345,7 @@ export default {
           }
           this.buttonLoading = true;
           settleSave(args)
-            .then(response => {
+            .then((response) => {
               if (response.data.code === 0) {
                 this.$message.success('保存成功');
                 //this.$message.success("提交结算申请结算成功");
@@ -2369,7 +2365,7 @@ export default {
         this.$message.error('数据异常');
         return;
       }
-      this.$refs['form'].validate(valid => {
+      this.$refs['form'].validate((valid) => {
         if (valid) {
           for (var i = 0; i < this.gridData.length; i++) {
             const item = this.gridData[i];
@@ -2394,7 +2390,7 @@ export default {
           }
           this.buttonLoading = true;
           settleSubmit(args)
-            .then(response => {
+            .then((response) => {
               if (response.data.code === 0) {
                 this.$message.success('提交成功');
               }
@@ -2419,12 +2415,12 @@ export default {
       //获取并存储服务器返回的AuthorizationToken信息
       // 发送下载报表请求
       console.log('发送下载报表请求');
-      let param = {fileName: 'batch_create_score_package_template.xlsx'};
+      let param = { fileName: 'batch_create_score_package_template.xlsx' };
       axios
         .post('/admin/template-file/download', param, {
           responseType: 'arraybuffer'
         })
-        .then(res => {
+        .then((res) => {
           fileDownload(res.data, '批量创建积分包模板.xlsx');
           this.$message.success('下载模板成功');
         });
@@ -2468,6 +2464,38 @@ export default {
     submitUpload(row) {
       // 开始上传按钮
       this.$refs.upload.submit(row);
+    },
+
+    async getUserV2List() {
+      const res = await getUserV2ListApi();
+      if (res.data.code === 0) {
+        this.userV2List = res.data.data;
+      }
+    },
+
+    handoverClose() {
+      this.handoverForm.ownerId = '';
+      this.handoverDialog = false;
+    },
+    handoverFn(row) {
+      this.currentInfo = row;
+      this.handoverDialog = true;
+    },
+    handoverSubmit() {
+      this.$refs.handoverFormRef.validate(async (valid) => {
+        if (valid) {
+          const obj = {
+            packageStatusId: this.currentInfo?.packageStatusList[0]?.id,
+            ownerId: this.handoverForm.ownerId
+          };
+          const res = await pkgOwnerReplaceApi(obj);
+          if (res.data.code === 0) {
+            this.$message.success('操作成功');
+            this.getList(this.page);
+            this.handoverDialog = false;
+          }
+        }
+      });
     }
   }
 };
@@ -2610,4 +2638,11 @@ export default {
   text-align: center;
   margin-top: 10px;
 }
+.handover-tips {
+  font-size: 18px;
+  color: red;
+  text-align: center;
+  font-weight: 600;
+  margin-bottom: 20px;
+}
 </style>