my_issue.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743
  1. <template>
  2. <div>
  3. <div class="box">
  4. <el-tabs v-model="status">
  5. <el-tab-pane :disabled="loading" v-for="(item, index) in tabsOption" :key="index" :label="item.label" :name="item.name"></el-tab-pane>
  6. </el-tabs>
  7. <div>
  8. <el-dropdown @command="downClick">
  9. <el-button type="primary">
  10. 发布任务
  11. <i class="el-icon-arrow-down el-icon--right"></i>
  12. </el-button>
  13. <el-dropdown-menu slot="dropdown">
  14. <el-dropdown-item command="1">+ 临时任务</el-dropdown-item>
  15. <el-dropdown-item command="2">+ 悬赏任务</el-dropdown-item>
  16. </el-dropdown-menu>
  17. </el-dropdown>
  18. </div>
  19. <FormBox style="margin: 10px 0;">
  20. <div class="form-item" v-if="status == 'assign'">
  21. <div class="form-label">状态</div>
  22. <div class="form-search">
  23. <el-select size="medium" v-model="formData.status" placeholder="请选择">
  24. <el-option v-for="item in task_status" :key="item.id" :label="item.name" :value="item.code"></el-option>
  25. </el-select>
  26. </div>
  27. </div>
  28. <div class="form-item" v-if="status == 'assign' || status == 'repetitive'">
  29. <div class="form-label">执行人</div>
  30. <div class="form-search">
  31. <el-select size="medium" v-model="formData.executor_id" clearable filterable placeholder="请输入或选择执行人">
  32. <el-option v-for="item in employee_map" :key="item.id" :label="item.name" :value="item.id"></el-option>
  33. </el-select>
  34. </div>
  35. </div>
  36. <div class="form-item">
  37. <div class="form-label">审批人</div>
  38. <div class="form-search">
  39. <el-select size="medium" v-model="formData.reviewer_id" clearable filterable placeholder="请输入或选择审批人">
  40. <el-option v-for="item in employee_map" :key="item.id" :label="item.name" :value="item.id"></el-option>
  41. </el-select>
  42. </div>
  43. </div>
  44. <div class="form-item" v-if="status == 'assign' || status == 'reward'">
  45. <div class="form-label">积分类型</div>
  46. <div class="form-search">
  47. <el-select size="medium" v-model="formData.pt_id" placeholder="请选择">
  48. <el-option v-for="item in point_types" :key="item.id" :label="item.name" :value="item.id"></el-option>
  49. </el-select>
  50. </div>
  51. </div>
  52. <div class="form-item" v-if="status == 'assign'">
  53. <div class="form-label">排序</div>
  54. <div class="form-search">
  55. <el-select size="medium" v-model="formData.sort" placeholder="请选择排序">
  56. <el-option v-for="item in sort" :key="item.id" :label="item.name" :value="item.code"></el-option>
  57. </el-select>
  58. </div>
  59. </div>
  60. <div class="form-item" v-if="status == 'reward'">
  61. <div class="form-label">排序</div>
  62. <div class="form-search">
  63. <el-select size="medium" v-model="formData.order_by" placeholder="请选择排序">
  64. <el-option v-for="item in order_by" :key="item.id" :label="item.name" :value="item.code"></el-option>
  65. </el-select>
  66. </div>
  67. </div>
  68. <div class="form-item">
  69. <div class="form-label">内容搜索</div>
  70. <div class="form-search">
  71. <el-input size="medium" clearable v-model="formData.content" placeholder="请输入" max="200"></el-input>
  72. </div>
  73. </div>
  74. </FormBox>
  75. <div v-show="status == 'assign'">
  76. <el-table :data="list" style="width: 100%" v-loading="loading" @row-click="rowClick">
  77. <el-table-column label="执行人" prop="task_name" width="250px">
  78. <template slot-scope="scope">
  79. <div style="display:flex">
  80. <userImage
  81. :img_url="scope.row.employee_img_url"
  82. :id="scope.row.employee_id"
  83. :user_name="scope.row.employee_name"
  84. width="50px"
  85. height="50px"
  86. ></userImage>
  87. <span style="line-height: 50px; padding-left: 10px;">{{ scope.row.employee_name }}的{{ scope.row.pt_name }}任务</span>
  88. </div>
  89. </template>
  90. </el-table-column>
  91. <el-table-column label="任务内容" prop="task_name">
  92. <template slot-scope="scope">
  93. <span class="font-flex-word" style="max-width: 200px;">{{ scope.row.task_name }}</span>
  94. </template>
  95. </el-table-column>
  96. <el-table-column label="积分" prop="base_point" width="100px">
  97. <template slot-scope="scope">
  98. <span v-if="scope.row.point_config && scope.row.point_config.review_point > 0" class="red">
  99. +{{ scope.row.point_config.review_point }} {{ scope.row.pt_name }}
  100. </span>
  101. <span v-else>
  102. <span v-if="scope.row.point_config && scope.row.point_config.base_point">
  103. <span class="red" v-if="scope.row.point_config.base_point > 0">+{{ scope.row.point_config.base_point }} {{ scope.row.pt_name }}</span>
  104. <span class="color_green" v-else>{{ scope.row.point_config.base_point }} {{ scope.row.pt_name }}</span>
  105. </span>
  106. </span>
  107. </template>
  108. </el-table-column>
  109. <el-table-column label="截止时间" prop="expire_time">
  110. <template slot-scope="scope">
  111. <span>{{ scope.row.expire_time }}</span>
  112. </template>
  113. </el-table-column>
  114. <el-table-column label="审批人" width="100px" prop="reviewer_name"></el-table-column>
  115. <el-table-column label="状态" prop="owner_id" width="100px">
  116. <template slot-scope="scope">
  117. <span class="orange" v-if="scope.row.status == 1">进行中</span>
  118. <span class="green" v-else-if="scope.row.status == 2">已完成</span>
  119. <span class="red" v-else-if="scope.row.status == 3">退回</span>
  120. <span class="green" v-else-if="scope.row.status == 4">已审批</span>
  121. <span class="textBox" v-else>已撤回</span>
  122. </template>
  123. </el-table-column>
  124. <el-table-column label="操作" align="center" width="80px">
  125. <template slot-scope="scope">
  126. <el-dropdown placement="bottom" :show-timeout="150" :hide-timeout="150">
  127. <span class="el-dropdown-links">···</span>
  128. <el-dropdown-menu slot="dropdown">
  129. <el-dropdown-item :disabled="false" v-if="scope.row.status == 1">
  130. <el-button type="text" class="color-blue" v-loading.fullscreen.lock="bodyLoad" @click.stop="issueAmend1(scope.row)">修改</el-button>
  131. </el-dropdown-item>
  132. <el-dropdown-item :disabled="false">
  133. <el-button type="text" class="color-red" v-loading.fullscreen.lock="bodyLoad" @click.stop="deletes(scope.row, 0)">删除</el-button>
  134. </el-dropdown-item>
  135. </el-dropdown-menu>
  136. </el-dropdown>
  137. </template>
  138. </el-table-column>
  139. <template slot="empty">
  140. <noData></noData>
  141. </template>
  142. </el-table>
  143. </div>
  144. <div v-show="status == 'reward'">
  145. <el-table :data="list" style="width: 100%" v-loading="loading" @row-click="rewardTasksClick">
  146. <el-table-column label="发布人" prop="employee_id">
  147. <template slot-scope="scope">
  148. <div style="display:flex">
  149. <userImage width="50px" height="50px" :img_url="scope.row.owner_img_url" :user_name="scope.row.owner_name"></userImage>
  150. <span style="line-height: 50px; padding-left: 10px;">我发布的{{ scope.row.pt_name }}任务</span>
  151. </div>
  152. </template>
  153. </el-table-column>
  154. <el-table-column label="任务内容" prop="task_name">
  155. <template slot-scope="scope">
  156. <span class="font-flex-word" style="max-width: 200px;">{{ scope.row.task_name }}</span>
  157. </template>
  158. </el-table-column>
  159. <el-table-column label="积分" prop="base_point" width="100px">
  160. <template slot-scope="scope">
  161. <span v-if="scope.row.base_point > 0" class="red">+{{ scope.row.base_point }} {{ scope.row.pt_name }}</span>
  162. <span v-else class="color_green">{{ scope.row.base_point }} {{ scope.row.pt_name }}</span>
  163. </template>
  164. </el-table-column>
  165. <el-table-column label="截止时间" prop="expire_time">
  166. <template slot-scope="scope">
  167. <span>{{ scope.row.expire_time }}</span>
  168. </template>
  169. </el-table-column>
  170. <el-table-column label="审批人" width="100px" prop="reviewer_name">
  171. <template slot-scope="scope">
  172. <span v-if="scope.row.reviewer_id">{{ list_approver(scope.row.reviewer_id) }}</span>
  173. </template>
  174. </el-table-column>
  175. <el-table-column label="状态" prop="owner_id" width="100px">
  176. <template slot-scope="scope">
  177. <span class="orange" v-if="scope.row.status == 1">待领取</span>
  178. <span class="orange" v-else-if="scope.row.status == 2">进行中</span>
  179. <span class="green" v-else-if="scope.row.status == 3">已完成</span>
  180. <span class="fontColorZ" v-else-if="scope.row.status == 4">已撤回</span>
  181. <span class="red" v-else>已过期</span>
  182. </template>
  183. </el-table-column>
  184. <el-table-column prop="base_point" label="操作" align="center" width="80px">
  185. <template slot-scope="scope">
  186. <el-dropdown placement="bottom" :show-timeout="150" :hide-timeout="150">
  187. <span class="el-dropdown-links">···</span>
  188. <el-dropdown-menu slot="dropdown">
  189. <el-dropdown-item :disabled="false" v-if="scope.row.status == 1">
  190. <el-button type="text" class="color-blue" v-loading.fullscreen.lock="bodyLoad" @click.stop="offerARewardAmend2(scope.row)">修改</el-button>
  191. </el-dropdown-item>
  192. <el-dropdown-item :disabled="false">
  193. <el-button type="text" class="color-red" v-loading.fullscreen.lock="bodyLoad" @click.stop="deletes(scope.row, 1)">删除</el-button>
  194. </el-dropdown-item>
  195. </el-dropdown-menu>
  196. </el-dropdown>
  197. </template>
  198. </el-table-column>
  199. <template slot="empty">
  200. <noData></noData>
  201. </template>
  202. </el-table>
  203. </div>
  204. <div v-if="status == 'repetitive'">
  205. <el-table :data="list" style="width: 100%" v-loading="loading" @row-click="repetitiveTasksClick">
  206. <el-table-column label="执行人" prop="target_info" width="120px">
  207. <template slot-scope="scope">
  208. <span v-for="(item, index) in scope.row.target_info" :key="index">
  209. <span v-if="scope.row.target_info.length == 1 && index == 0">{{ item.name }}</span>
  210. <span v-if="scope.row.target_info.length > 1 && index == 0">{{ item.name }}等{{ scope.row.target_info.length }}人</span>
  211. </span>
  212. </template>
  213. </el-table-column>
  214. <el-table-column label="任务内容" prop="remark">
  215. <template slot-scope="scope">
  216. <span class="font-flex-word" style="max-width: 200px;">{{ scope.row.name || scope.row.remark }}</span>
  217. </template>
  218. </el-table-column>
  219. <el-table-column label="任务积分" prop="point_config.base_point" width="130px">
  220. <template slot-scope="scope">
  221. <span v-if="scope.row.point_config.base_point > 0" class="red">+{{ scope.row.point_config.base_point }} {{ $getTypsName(scope.row.pt_id) }}</span>
  222. <span v-else class="color_green">{{ scope.row.point_config.base_point }} {{ $getTypsName(scope.row.pt_id) }}</span>
  223. </template>
  224. </el-table-column>
  225. <el-table-column label="重复周期" prop="task_cycle" width="220px">
  226. <template slot-scope="scope">
  227. <span v-if="scope.row.task_cycle == '1'">每天0点自动发布,{{ dayTime(scope.row.task_cycle_value) }}截止</span>
  228. <span v-if="scope.row.task_cycle == '2'">
  229. <span>每周一自动发布,周{{ weekList[scope.row.task_cycle_value - 1] }}截止</span>
  230. </span>
  231. <span v-if="scope.row.task_cycle == '3'">每月1号自动发布,{{ scope.row.task_cycle_value }}号截止</span>
  232. </template>
  233. </el-table-column>
  234. <el-table-column label="可见范围" prop="department_info">
  235. <template slot-scope="scope">
  236. <span v-for="(item, index) in scope.row.department_info" :key="index">
  237. {{ item.name }}
  238. <span v-if="scope.row.department_info.length - 1 > index">,</span>
  239. </span>
  240. </template>
  241. </el-table-column>
  242. <el-table-column label="创建时间" prop="create_time" width="140px"></el-table-column>
  243. <el-table-column label="状态" prop="create_time" width="140px">
  244. <template slot-scope="scope">
  245. <span class="blue" v-if="scope.row.enable">已启用</span>
  246. <span class="red" v-else>已暂停</span>
  247. </template>
  248. </el-table-column>
  249. <el-table-column prop="base_point" label="操作" width="80px">
  250. <template slot-scope="scope">
  251. <div class="flex-box-ce">
  252. <el-dropdown placement="bottom" :show-timeout="150" :hide-timeout="150">
  253. <span class="el-dropdown-links">···</span>
  254. <el-dropdown-menu slot="dropdown">
  255. <el-dropdown-item ><el-button type="text" class="color-blue" v-loading.fullscreen.lock="bodyLoad" @click.stop="copyTask(scope.row)">复制</el-button></el-dropdown-item>
  256. <el-dropdown-item >
  257. <el-button type="text" class="color-blue" v-loading.fullscreen.lock="bodyLoad" @click.stop="enable(scope.row)">{{scope.row.enable==1? '暂停任务':'启用任务'}}</el-button>
  258. </el-dropdown-item>
  259. <el-dropdown-item ><el-button type="text" class="color-red" v-loading.fullscreen.lock="bodyLoad" @click.stop="deletes(scope.row, 2)">删除</el-button></el-dropdown-item>
  260. </el-dropdown-menu>
  261. </el-dropdown>
  262. </div>
  263. </template>
  264. </el-table-column>
  265. <template slot="empty">
  266. <noData></noData>
  267. </template>
  268. </el-table>
  269. </div>
  270. <center style="padding: 20px 0;">
  271. <el-pagination
  272. background
  273. @size-change="handleSizeChange"
  274. @current-change="handleCurrentChange"
  275. :page-sizes="[10, 20, 50, 100]"
  276. layout="total, sizes, prev, pager, next"
  277. :page-size="formData.page_size"
  278. :current-page="formData.page"
  279. :total="total"
  280. ></el-pagination>
  281. </center>
  282. </div>
  283. <!-- 临时任务 -->
  284. <temporaryTask :dialogVisible.sync="dialogVisible" :trees_ab="trees_v2_ab_module" :isFy="isFy" :modifyData="fyData" :showTitle="'临时任务'"></temporaryTask>
  285. <!-- 临时任务-修改 -->
  286. <temporaryTaskAmend :dialogVisible.sync="dialogVisibleAmend" :trees_ab="trees_v2_ab_module" :showTitle="'任务编辑'" :modifyData="modifyData"></temporaryTaskAmend>
  287. <!-- 悬赏任务 -->
  288. <rewardTask :dialogVisible.sync="rewardTaskShow" :isFy="isFy" :modifyData="fyData" :trees_ab="trees_v2_ab_module" :showTitle="'悬赏任务'"></rewardTask>
  289. <!-- 悬赏任务-修改 -->
  290. <rewardTaskAmend
  291. :dialogVisible.sync="rewardTaskAmendShow"
  292. :trees_ab="trees_v2_ab_module"
  293. ref="rewardTasks"
  294. :showTitle="'任务编辑'"
  295. :rewardTaskAmendData="rewardTaskAmendData"
  296. ></rewardTaskAmend>
  297. <!-- 详情弹窗 -->
  298. <taskDetailsPopup :visible.sync="showDetailPopup" v-if="showDetailPopup" :id="detailId" :title="'任务详情'"></taskDetailsPopup>
  299. <!-- 重复任务详情弹窗 -->
  300. <repeatTaskDetailsPopup :visible.sync="showRepetitiveTasksPopup" v-if="showRepetitiveTasksPopup" :id="detailId" :title="'重复任务详情'"></repeatTaskDetailsPopup>
  301. <!-- 悬赏任务详情弹窗 -->
  302. <rewardTaskDetailsPopup :visible.sync="showRewardTaskDetailsPopup" v-if="showRewardTaskDetailsPopup" :id="detailId" :title="'工作详情'"></rewardTaskDetailsPopup>
  303. </div>
  304. </template>
  305. <script>
  306. import {_debounce} from '@/api/auth';
  307. import temporaryTask from '@/views/common/temporaryTask';
  308. import temporaryTaskAmend from '@/views/common/temporaryTaskAmend';
  309. import rewardTask from '@/views/common/rewardTask';
  310. import rewardTaskAmend from '@/views/common/rewardTaskAmend';
  311. import taskDetailsPopup from '@/views/common/taskDetailsPopup';
  312. import repeatTaskDetailsPopup from '@/views/common/repeatTaskDetailsPopup';
  313. import rewardTaskDetailsPopup from '@/views/common/rewardTaskDetailsPopup';
  314. export default {
  315. name: 'my_issue',
  316. data() {
  317. return {
  318. weekList: ['一', '二', '三', '四', '五', '六', '日'],
  319. rewardTaskAmendData: {}, //悬赏修改
  320. modifyData: {}, //任务修改
  321. operation_if: false, //操作列显示隐藏
  322. bodyLoad: false,
  323. status: 'assign',
  324. formData: {
  325. status: 'all',
  326. sort: 'publish',
  327. order_by: 'create_time',
  328. pt_id: 0,
  329. page_size: 10,
  330. page: 1,
  331. source_type: '1',
  332. executor_id: '', //执行人
  333. reviewer_id: '', //审批人
  334. content: '' //内容
  335. },
  336. total: null,
  337. list: [],
  338. loading: false,
  339. point_types: null,
  340. task_status: [
  341. { id: 1, name: '全部', code: 'all' },
  342. { id: 2, name: '进行中', code: 'running' },
  343. { id: 3, name: '已完成', code: 'complete' },
  344. { id: 4, name: '已审批', code: 'reviewed' },
  345. // {id: 5, name: '已撤销', code: 'revocation'},
  346. // { id: 6, name: '已退回', code: 'refuse' }
  347. ],
  348. sort: [{ id: 2, name: '按发布时间', code: 'publish' }, { id: 1, name: '按截止时间', code: 'expire' }],
  349. order_by: [{ id: 2, name: '按发布时间', code: 'create_time' }, { id: 1, name: '按截止时间', code: 'expire_time' }],
  350. tabsOption: [{ label: '我指派的', name: 'assign' }, { label: '我悬赏的', name: 'reward' }, { label: '重复任务', name: 'repetitive' }],
  351. dialogVisible: false,
  352. dialogVisibleAmend: false,
  353. rewardTaskShow: false,
  354. rewardTaskAmendShow: false,
  355. showDetailPopup: false,
  356. showRepetitiveTasksPopup: false,
  357. showRewardTaskDetailsPopup: false,
  358. detailId: 0,
  359. trees_v2_ab_module: {
  360. A: [],
  361. B: [],
  362. rule_tree: []
  363. },
  364. employee_map: [], //人员列表
  365. //重复任务复用
  366. isFy:false,
  367. fyData:{},
  368. };
  369. },
  370. components: {temporaryTask, rewardTask, rewardTaskAmend, temporaryTaskAmend, taskDetailsPopup, repeatTaskDetailsPopup, rewardTaskDetailsPopup },
  371. watch: {
  372. dialogVisible(val){
  373. if(!val){
  374. this.isFy=false;
  375. }
  376. },
  377. rewardTaskShow(val){
  378. if(!val){
  379. this.isFy=false;
  380. }
  381. },
  382. status(val) {
  383. this.formData.executor_id = '';
  384. this.formData.reviewer_id = '';
  385. this.formData.content = '';
  386. this.formData.page = 1;
  387. this.formData.status = 'all';
  388. this.formData.sort = 'publish';
  389. this.formData.order_by = 'create_time';
  390. this.formData.pt_id = 0;
  391. this.list = [];
  392. this.get_list();
  393. },
  394. 'formData.status'() {
  395. // debugger
  396. this.formData.page = 1;
  397. this.list = [];
  398. this.get_list();
  399. },
  400. 'formData.sort'() {
  401. this.formData.page = 1;
  402. this.list = [];
  403. this.get_list();
  404. },
  405. 'formData.order_by'() {
  406. this.formData.page = 1;
  407. this.list = [];
  408. this.get_list();
  409. },
  410. 'formData.pt_id'() {
  411. this.formData.page = 1;
  412. this.list = [];
  413. this.get_list();
  414. },
  415. 'formData.executor_id'() {
  416. this.formData.page = 1;
  417. this.list = [];
  418. this.get_list();
  419. },
  420. 'formData.reviewer_id'() {
  421. this.formData.page = 1;
  422. this.list = [];
  423. this.get_list();
  424. },
  425. 'formData.content': {
  426. deep: true,
  427. handler: _debounce(function(val) {
  428. this.formData.page = 1;
  429. this.list = [];
  430. this.get_list();
  431. }, 1000)
  432. },
  433. },
  434. created() {
  435. this.getRuleItemData(); //获取AB分细则
  436. },
  437. mounted() {
  438. this.getUserDetail();
  439. if (this.$route.query.type == 1) {
  440. this.dialogVisible = true;
  441. } else if (this.$route.query.type == 2) {
  442. this.rewardTaskShow = true;
  443. }
  444. this.get_list();
  445. this.point_types = this.getPointTypes();
  446. this.getEmployee(); //员工列表
  447. },
  448. methods: {
  449. enable(item){
  450. this.$axios('post', '/api/integral/schedule/enable', { schedule_id:item.id }).then(res => {
  451. this.$message.success(item.enable==1? '已暂停':'已启用');
  452. this.get_list();
  453. });
  454. },
  455. list_approver(id) {
  456. let arr = this.employee_map.filter(x => x.id == id);
  457. return arr[0] ? arr[0].name : '';
  458. },
  459. dayTime(item) {
  460. return item > 9 ? item + ': 00' : '0' + item + ': 00';
  461. },
  462. //获取员工列表
  463. getEmployee() {
  464. this.$axios('get', '/api/employee/index', { dept_id: 0, keywords: '', page: 1, page_size: 3000, is_official: 1 }).then(res => {
  465. let list = res.data.data.list;
  466. this.employee_map = list;
  467. });
  468. },
  469. getUserDetail() {
  470. this.$axios('get', '/api/employee/detail').then(res => {
  471. this.$setUserData(res.data.data.user);
  472. });
  473. },
  474. //悬赏修改
  475. offerARewardAmend2(item) {
  476. this.rewardTaskAmendShow = true;
  477. this.$refs.rewardTasks.forTheTaskLoading = true;
  478. let params = {
  479. task_id: item.id
  480. };
  481. this.$axios('get', '/api/integral/task', params)
  482. .then(res => {
  483. if (res.data.code == 1) {
  484. this.rewardTaskAmendData = res.data.data;
  485. } else {
  486. self.$message.error(res.data.msg);
  487. }
  488. })
  489. .finally(() => {
  490. this.$refs.rewardTasks.forTheTaskLoading = false;
  491. });
  492. },
  493. //重复任务复用
  494. copyTask(item){
  495. this.$axios('get', '/api/integral/schedule', { schedule_id: item.id }).then(res => {
  496. let data=res.data.data
  497. data.task_file_list=data.file_list;
  498. data.id="";
  499. this.isFy=true;
  500. this.fyData=data;
  501. this.downClick(item.type)
  502. });
  503. },
  504. //任务修改
  505. issueAmend1(item) {
  506. this.modifyData = item;
  507. this.dialogVisibleAmend = true;
  508. },
  509. //删除---我指派的、我悬赏的、重复任务 (重复任务需等后端接口)
  510. deletes(item, s) {
  511. let self = this;
  512. this.$message.closeAll();
  513. self.$confirm('删除此任务将会删除其相关记录和积分数据,确认删除吗?', '删除任务', {
  514. confirmButtonText: '确定',
  515. cancelButtonText: '取消',
  516. type: 'warning'
  517. }).then(() => {
  518. self.$axios(
  519. s == 0 ? 'get' : s == 1 ? 'get' : 'get',
  520. s == 0 ? '/api/integral/work/delete' : s == 1 ? '/api/integral/task/delete' : '/api/integral/schedule/delete',
  521. s == 0 ? { work_id: item.id } : s == 1 ? { task_id: item.id } : { schedule_id: item.id }
  522. ).then(res => {
  523. if (res.data.code == 1) {
  524. if (this.formData.page > 1) {
  525. if (self.list.length == 1) {
  526. this.formData.page = this.formData.page - 1;
  527. }
  528. }
  529. this.get_list();
  530. self.$message.success(res.data.msg);
  531. } else {
  532. self.$message.error(res.data.msg);
  533. }
  534. });
  535. });
  536. },
  537. // 点击详情
  538. rowClick(row) {
  539. this.showDetailPopup = true;
  540. this.detailId = parseInt(row.id);
  541. },
  542. // 重复任务详情
  543. repetitiveTasksClick(row) {
  544. this.showRepetitiveTasksPopup = true;
  545. this.detailId = parseInt(row.id);
  546. },
  547. // 悬赏任务详情
  548. rewardTasksClick(row) {
  549. this.showRewardTaskDetailsPopup = true;
  550. this.detailId = parseInt(row.id);
  551. },
  552. // 发布临时任务 和 悬赏任务
  553. downClick(val) {
  554. if (val == 1) {
  555. this.dialogVisible = true;
  556. } else {
  557. this.rewardTaskShow = true;
  558. }
  559. },
  560. // 获取积分类型
  561. getPointTypes() {
  562. let point =this.$getCache('types');
  563. point.unshift({ code: 'all', id: 0, name: '全部' });
  564. return point;
  565. },
  566. // 页码变更
  567. handleCurrentChange(val) {
  568. this.formData.page = val;
  569. this.get_list();
  570. },
  571. handleSizeChange(val) {
  572. this.formData.page_size = val;
  573. this.get_list();
  574. },
  575. get_list() {
  576. let self = this;
  577. this.list=[];
  578. self.loading = true;
  579. let params = JSON.parse(JSON.stringify(this.formData));
  580. params.pt_id == 0 ? delete params.pt_id : '';
  581. params.executor_id == '' ? delete params.executor_id : '';
  582. params.reviewer_id == '' ? delete params.reviewer_id : '';
  583. if (self.status == 'assign') {
  584. delete params.order_by;
  585. } else if (self.status == 'reward') {
  586. delete params.executor_id;
  587. delete params.status;
  588. delete params.sort;
  589. } else {
  590. delete params.status;
  591. delete params.sort;
  592. delete params.order_by;
  593. delete params.pt_id;
  594. }
  595. self.$axios(
  596. 'get',
  597. self.status == 'assign' ? '/api/integral/work/list/publisher' : self.status == 'reward' ? '/api/integral/task/publish/list' : '/api/integral/schedule/list',
  598. params
  599. )
  600. .then(res => {
  601. //数据过多的情况延迟较大
  602. if (res.data.code == 1) {
  603. //传入发布者ID进行判断
  604. self.list = res.data.data.list;
  605. if(this.formData.page==1){
  606. self.total = res.data.data.total;
  607. }
  608. } else {
  609. self.$message.error(res.data.data.msg);
  610. this.get_list();
  611. }
  612. })
  613. .finally(() => {
  614. self.loading = false;
  615. });
  616. },
  617. // 获取ab规则细则
  618. getRuleItemData() {
  619. let a = this.$axios('get', '/api/integral/rule/trees', { cycle_type: '1', pt_id: '2' }, 'v2');
  620. let b = this.$axios('get', '/api/integral/rule/trees', { cycle_type: '1', pt_id: '3' }, 'v2');
  621. let c = this.$axios('get', '/api/integral/rule/trees', { cycle_type: '1' });
  622. Promise.all([a, b, c]).then(res => {
  623. this.trees_v2_ab_module={
  624. A:res[0].data.data.tree,
  625. B:res[1].data.data.tree,
  626. rule_tree:this.flatten(res[2].data.data.rule_tree),
  627. rule_tree_all:this.getTreeData(res[2].data.data.rule_tree),
  628. item_list:res[2].data.data.item_list,
  629. }
  630. });
  631. },
  632. getItemDetail(arr) {
  633. let result = [];
  634. for (const item of arr) {
  635. var res = JSON.parse(JSON.stringify(item)); // 先克隆一份数据作为第一层级的填充
  636. delete res['child'];
  637. result.push(res);
  638. if (item.child instanceof Array && item.child.length > 0) {
  639. // 如果当前child为数组并且长度大于0,才可进入getItemDetail()方法
  640. result = result.concat(this.getItemDetail(item.child));
  641. }
  642. }
  643. return result;
  644. },
  645. getTreeData(data) {
  646. for (var i = 0; i < data.length; i++) {
  647. if (data[i].child.length < 1) {
  648. // child若为空数组,则将child设为undefined
  649. data[i].child = undefined;
  650. } else {
  651. // child若不为空数组,则继续 递归调用 本方法
  652. this.getTreeData(data[i].child);
  653. }
  654. }
  655. return data;
  656. },
  657. flatten(arr) {
  658. return arr.reduce((result, item) => {
  659. return result.concat(item, Array.isArray(item.child) ? this.flatten(item.child) : []);
  660. }, []);
  661. }
  662. }
  663. };
  664. </script>
  665. <style scoped lang="scss">
  666. .box {
  667. min-height: calc(100vh - 184px);
  668. min-width: 800px;
  669. background-color: #fff;
  670. padding: 20px;
  671. & .color_yelllo {
  672. color: #e6a23c;
  673. }
  674. & .color_green {
  675. color: #67c23a;
  676. }
  677. & .color_3 {
  678. color: #f56c6c;
  679. }
  680. & .color_4 {
  681. color: #67c23a;
  682. }
  683. & .color_5 {
  684. color: #f56c6c;
  685. }
  686. & .color_yelllo2 {
  687. color: #ffa939;
  688. }
  689. }
  690. $red: #f56c6c;
  691. .color-red {
  692. color: $red;
  693. &:hover {
  694. color: #f14141;
  695. }
  696. }
  697. .color-blue {
  698. color: #26A2FF;
  699. &:hover {
  700. color: #26A2FF;
  701. }
  702. }
  703. .delicon {
  704. font-size: 20px;
  705. float: right;
  706. }
  707. .el-dropdown-links {
  708. font-size: 20px;
  709. cursor: pointer;
  710. color: #606266;
  711. }
  712. ::v-deep .el-table tr:hover {
  713. cursor: pointer;
  714. }
  715. </style>