rewardTaskAmend.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536
  1. <template>
  2. <div>
  3. <!-- 悬赏任务弹窗 -->
  4. <el-dialog :title="showTitle" :visible.sync="dialogVisible" :close-on-click-modal="false" :before-close="closeDialog" width="600px" top="5%">
  5. <div v-loading="forTheTaskLoading">
  6. <el-form :model="formData" ref="formData" label-width="80px">
  7. <el-form-item
  8. label="任务内容"
  9. prop="task_name"
  10. :rules="[{ required: true, message: '请填写任务内容', trigger: 'blur' }, { min: 3, max: 20, message: '长度在 3 到 20 个字符', trigger: 'blur' }]"
  11. >
  12. <el-input type="textarea" rows="3" maxlength="20" show-word-limit v-model="formData.task_name" placeholder="请输入任务内容(限20字)" class="reward_textarea"></el-input>
  13. </el-form-item>
  14. <el-form-item label="任务积分" prop="base_point" :rules="[{ required: true, message: '请填写任务积分', trigger: 'blur' }]">
  15. <el-input-number v-model="formData.base_point" :min="1"></el-input-number>
  16. </el-form-item>
  17. <el-form-item label="审批人" prop="reviewer_id" :rules="[{ required: true, message: '请选择审批人', trigger: 'change' }]">
  18. <el-row>
  19. <el-col :span="18">
  20. <el-input auto-complete="off" v-model="reviewerName" placeholder="请选择审批人"></el-input>
  21. <div @click="show_reviewer_selector = true" style=" position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
  22. </el-col>
  23. </el-row>
  24. <el-dialog title="选择审批人" width="640px" :visible.sync="show_reviewer_selector" append-to-body :before-close="handleClose">
  25. <EmployeeSelector
  26. v-if="show_reviewer_selector"
  27. ref="members"
  28. :multi="false"
  29. :isCreatorSelect="true"
  30. :employee_list="reviewer_employee_list"
  31. :use_Administrator_list="true"
  32. :selected="reviewer_selected"
  33. @confirm="reviewer_confirm"
  34. />
  35. <span slot="footer" class="dialog-footer">
  36. <el-button @click="show_reviewer_selector = false">取 消</el-button>
  37. <el-button type="primary" @click="submitMembers('members')">确 定</el-button>
  38. </span>
  39. </el-dialog>
  40. </el-form-item>
  41. <el-form-item label="积分类型" prop="pt_id" :rules="[{ required: true, message: '请选择积分类型', trigger: 'blur' }]">
  42. <el-radio-group v-model="formData.pt_id">
  43. <el-radio v-for="(item, index) in point_types" :key="index" v-show="item.code !== 'JX'" :label="item.id">{{ item.name }}</el-radio>
  44. </el-radio-group>
  45. </el-form-item>
  46. <el-form-item label="截止日期" prop="expire_time" v-if="formData.task_cycle == 0" :rules="[{ required: true, message: '请选择截止日期', trigger: 'blur' }]">
  47. <el-date-picker
  48. v-model="formData.expire_time"
  49. type="datetime"
  50. placeholder="选择日期时间"
  51. format="yyyy-MM-dd HH:mm"
  52. value-format="yyyy-MM-dd HH:mm"
  53. default-time="18:00"
  54. ></el-date-picker>
  55. </el-form-item>
  56. <el-form-item label="截止日期" prop="task_expire_day" v-if="formData.task_cycle == 1" :rules="[{ required: true, message: '请选择截止日期', trigger: 'blur' }]">
  57. <el-select v-model="formData.task_expire_day" placeholder="请选择截止日期">
  58. <el-option v-for="item in columns1" :key="item.value" :label="item.name" :value="item.value"></el-option>
  59. </el-select>
  60. </el-form-item>
  61. <el-form-item label="截止日期" prop="task_expire_day" v-if="formData.task_cycle == 2" :rules="[{ required: true, message: '请选择截止日期', trigger: 'blur' }]">
  62. <el-select v-model="formData.task_expire_day" placeholder="请选择截止日期">
  63. <el-option v-for="item in columns2" :key="item.value" :label="item.name" :value="item.value"></el-option>
  64. </el-select>
  65. </el-form-item>
  66. <el-form-item label="截止日期" prop="task_expire_day" v-if="formData.task_cycle == 3" :rules="[{ required: true, message: '请选择截止日期', trigger: 'blur' }]">
  67. <el-select v-model="formData.task_expire_day" placeholder="请选择截止日期">
  68. <el-option v-for="item in columns3" :key="item.value" :label="item.name" :value="item.value"></el-option>
  69. </el-select>
  70. </el-form-item>
  71. <el-form-item label="任务描述" prop="task_remark" :rules="[{ max: 300, message: '长度不能超过 300 个字', trigger: 'blur' }]">
  72. <el-input type="textarea" :rows="5" v-model="formData.task_remark" maxlength="300" show-word-limit placeholder="请输入任务内容(限300字)"></el-input>
  73. </el-form-item>
  74. <el-form-item label="谁可以看" prop="dept_ids">
  75. <el-cascader
  76. size="medium"
  77. class="date-picker-width"
  78. v-model="dept_name"
  79. @change="handleChange"
  80. :options="dept_tree"
  81. collapse-tags
  82. :props="{ checkStrictly: true, value: 'id', label: 'name', multiple: true, children: '_child' }"
  83. ref="depts"
  84. clearable
  85. placeholder="全公司"
  86. ></el-cascader>
  87. <span style="color:#b5b7bb;padding-left:10px;">选中的部门可查看或领取任务</span>
  88. </el-form-item>
  89. <div style="margin-left: 80px; margin-bottom: 8px;">以天为单位,每 提前/逾期 一天 加分/扣分</div>
  90. <el-form-item label="提前奖分" prop="ahead_award_point">
  91. <el-input v-model="formData.ahead_award_point" oninput="value=value.replace(/[^\d]/g,'')" placeholder="请输入每日奖分" style="width: 150px;"></el-input> 分/每天,
  92. 奖分上限 &nbsp;<el-input v-model="formData.ahead_award_point_limit" oninput="value=value.replace(/[^\d]/g,'')" placeholder="请输入奖分上限" style="width: 150px;"></el-input> 分
  93. </el-form-item>
  94. <el-form-item label="逾期扣分" prop="timeout_deduction_point" >
  95. <el-input v-model="formData.timeout_deduction_point" oninput="value=value.replace(/[^\d]/g,'')" placeholder="请输入每日扣分" style="width: 150px;"></el-input> 分/每天,
  96. 扣分上限 &nbsp;<el-input v-model="formData.timeout_deduction_point_limit" oninput="value=value.replace(/[^\d]/g,'')" placeholder="请输入扣分上限" style="width: 150px;"></el-input> 分
  97. </el-form-item>
  98. <el-form-item v-show="false" prop="ahead_award_point_limit" ></el-form-item>
  99. <el-form-item v-show="false" prop="timeout_deduction_point_limit" ></el-form-item>
  100. <el-form-item>
  101. <el-button type="primary" @click="sub('formData')">确认修改</el-button>
  102. <el-button @click="resetForm('formData')">取消</el-button>
  103. </el-form-item>
  104. </el-form>
  105. </div>
  106. </el-dialog>
  107. </div>
  108. </template>
  109. <script>
  110. import moment from 'moment';
  111. import EmployeeSelector from '@/components/EmployeeSelector.vue';
  112. export default {
  113. name: 'bonusPoints',
  114. props: {
  115. rewardTaskAmendData: {
  116. type: Object
  117. },
  118. employee_not_select: {
  119. type: Array,
  120. default: () => {
  121. return [];
  122. }
  123. },
  124. dialogVisible: {
  125. type: Boolean,
  126. default: false
  127. },
  128. showTitle: {
  129. type: String,
  130. default: ''
  131. }
  132. },
  133. data() {
  134. return {
  135. dept_name: [],
  136. dept_tree: [],
  137. forTheTaskLoading: false,
  138. formData: {
  139. id: 0,
  140. task_type: '1',
  141. pt_id: 2,
  142. task_name: '',
  143. task_remark: '',
  144. base_point: '',
  145. expire_time: moment().format('YYYY-MM-DD 18:00'),
  146. task_expire_day: '',
  147. targets: [],
  148. reviewer_id: '',
  149. task_cycle: 0,
  150. timeout_deduction_point: null,
  151. timeout_deduction_point_limit: null,
  152. ahead_award_point: null,
  153. ahead_award_point_limit: null,
  154. dept_ids: null
  155. },
  156. point_types: [],
  157. // 执行者
  158. // executorName: null,
  159. // show_approval_selector: false,
  160. // approval_selected: {dept: [],employee:[]},
  161. // approval_not_select: [],
  162. // employee_list: this.$store.getters.user_info.employee_detail.manage_scope,
  163. // 审批人
  164. reviewerName: null,
  165. reviewer_not_select: [],
  166. reviewer_employee_list: [],
  167. reviewer_selected: { dept: [], employee: [] },
  168. show_reviewer_selector: false,
  169. // 重复周期
  170. task_cycle_arr: [{ value: 0, name: '不重复' }, { value: 1, name: '每天重复' }, { value: 2, name: '每周重复' }, { value: 3, name: '每月重复' }],
  171. // 周期时间
  172. columns1: [
  173. { name: '01:00', value: 1 },
  174. { name: '02:00', value: 2 },
  175. { name: '03:00', value: 3 },
  176. { name: '04:00', value: 4 },
  177. { name: '05:00', value: 5 },
  178. { name: '06:00', value: 6 },
  179. { name: '07:00', value: 7 },
  180. { name: '08:00', value: 8 },
  181. { name: '09:00', value: 9 },
  182. { name: '10:00', value: 10 },
  183. { name: '11:00', value: 11 },
  184. { name: '12:00', value: 12 },
  185. { name: '13:00', value: 13 },
  186. { name: '14:00', value: 14 },
  187. { name: '15:00', value: 15 },
  188. { name: '16:00', value: 16 },
  189. { name: '17:00', value: 17 },
  190. { name: '18:00', value: 18 },
  191. { name: '19:00', value: 19 },
  192. { name: '20:00', value: 20 },
  193. { name: '21:00', value: 21 },
  194. { name: '22:00', value: 22 },
  195. { name: '23:00', value: 23 },
  196. { name: '24:00', value: 24 }
  197. ],
  198. columns2: [
  199. { name: '周一', value: 1 },
  200. { name: '周二', value: 2 },
  201. { name: '周三', value: 3 },
  202. { name: '周四', value: 4 },
  203. { name: '周五', value: 5 },
  204. { name: '周六', value: 6 },
  205. { name: '周日', value: 7 }
  206. ],
  207. columns3: [
  208. { name: '1号', value: 1 },
  209. { name: '2号', value: 2 },
  210. { name: '3号', value: 3 },
  211. { name: '4号', value: 4 },
  212. { name: '5号', value: 5 },
  213. { name: '6号', value: 6 },
  214. { name: '7号', value: 7 },
  215. { name: '8号', value: 8 },
  216. { name: '9号', value: 9 },
  217. { name: '10号', value: 10 },
  218. { name: '11号', value: 11 },
  219. { name: '12号', value: 12 },
  220. { name: '13号', value: 13 },
  221. { name: '14号', value: 14 },
  222. { name: '15号', value: 15 },
  223. { name: '16号', value: 16 },
  224. { name: '17号', value: 17 },
  225. { name: '18号', value: 18 },
  226. { name: '19号', value: 19 },
  227. { name: '20号', value: 20 },
  228. { name: '21号', value: 21 },
  229. { name: '22号', value: 22 },
  230. { name: '23号', value: 23 },
  231. { name: '24号', value: 24 },
  232. { name: '25号', value: 25 },
  233. { name: '26号', value: 26 },
  234. { name: '27号', value: 27 },
  235. { name: '28号', value: 28 },
  236. { name: '29号', value: 29 },
  237. { name: '30号', value: 30 },
  238. { name: '31号', value: 31 }
  239. ],
  240. // 部门可见
  241. deptVisibleName: null,
  242. dept_not_select: [],
  243. dept_employee_list: [],
  244. dept_selected: { dept: [], employee: [] },
  245. show_employee_selector: false,
  246. chapterArr: [],
  247. oneruleId: [],
  248. echoGather: []
  249. };
  250. },
  251. components: { EmployeeSelector },
  252. watch: {
  253. 'formData.task_cycle'(val) {
  254. if (val) {
  255. this.formData.task_expire_day = 1;
  256. } else {
  257. this.formData.expire_time = moment().format('YYYY-MM-DD 18:00');
  258. }
  259. },
  260. rewardTaskAmendData() {
  261. this.formData.id = this.rewardTaskAmendData.id; //任务id
  262. this.formData.pt_id = this.rewardTaskAmendData.pt_id; //积分种类id
  263. this.formData.task_name = this.rewardTaskAmendData.task_name; //任务名
  264. this.formData.task_remark = this.rewardTaskAmendData.task_remark; //任务详细描述
  265. this.formData.base_point = this.rewardTaskAmendData.point_config.base_point; //任务参考积分
  266. this.formData.expire_time = this.rewardTaskAmendData.expire_time; //截至时间
  267. this.reviewerName = this.rewardTaskAmendData.reviewer_name; //审批者id
  268. this.formData.reviewer_id = this.rewardTaskAmendData.reviewer_id;
  269. this.reviewer_selected.employee = [
  270. { id: this.rewardTaskAmendData.reviewer_id, img_url: this.rewardTaskAmendData.img_url, name: this.rewardTaskAmendData.reviewer_name }
  271. ];
  272. let add = ['ahead_award_point', 'ahead_award_point_limit', 'timeout_deduction_point', 'timeout_deduction_point_limit']
  273. add.forEach(item =>{
  274. this.deductionPoint(item)
  275. })
  276. let department_infoName = '';
  277. // avatar: "static/images/e66f.jpg"
  278. // dept_id: 462
  279. // dept_name: "技术部"
  280. let deptIDs = [];
  281. this.dept_selected = { dept: [], employee: [] };
  282. for (let i in this.rewardTaskAmendData.department_info) {
  283. deptIDs.push(this.rewardTaskAmendData.department_info[i].id);
  284. let department_infoDept = {};
  285. department_infoDept.dept_id = this.rewardTaskAmendData.department_info[i].id;
  286. department_infoDept.dept_name = this.rewardTaskAmendData.department_info[i].name;
  287. department_infoDept.avatar = 'static/images/e66f.jpg';
  288. this.dept_selected.dept.push(department_infoDept);
  289. // department_infoName.push(this.rewardTaskAmendData.department_info[i].name)
  290. department_infoName += this.rewardTaskAmendData.department_info[i].name + ',';
  291. }
  292. this.deptVisibleName = department_infoName;
  293. this.formData.dept_ids = deptIDs; //可见范围
  294. let deptIDdata = deptIDs;
  295. for (let i in deptIDdata) {
  296. this.getTreeDatas(this.dept_tree, deptIDdata[i]);
  297. }
  298. this.dept_name = this.echoGather;
  299. }
  300. },
  301. mounted() {
  302. this.point_types = JSON.parse(localStorage.getItem('types'));
  303. this.getDepartment();
  304. },
  305. methods: {
  306. deductionPoint(item){
  307. if (this.rewardTaskAmendData.point_config[item] != '0') {
  308. this.formData[item] = this.rewardTaskAmendData.point_config[item];
  309. } else {
  310. this.formData[item] = '';
  311. }
  312. },
  313. handleChange(val) {
  314. let data = [];
  315. for (let i in val) {
  316. data.push(val[i][val[i].length - 1]);
  317. }
  318. this.formData.dept_ids = data;
  319. },
  320. submitMembers(name) {
  321. this.$refs[name].confirm(); //调用组件的confirm();
  322. },
  323. //关闭
  324. handleClose(done) {
  325. done();
  326. },
  327. sub(formName) {
  328. this.$refs[formName].validate(valid => {
  329. if (valid) {
  330. this.saveFun(formName);
  331. }
  332. });
  333. },
  334. resetForm(formName) {
  335. this.echoGather = [];
  336. this.$emit('update:dialogVisible', false);
  337. this.$refs[formName].resetFields();
  338. this.executorName = '';
  339. this.reviewerName = '';
  340. this.dept_name = [];
  341. this.dept_selected = { dept: [], employee: [] };
  342. },
  343. ahead_timeout(item,arr,codes,code){
  344. if(item){
  345. if(arr){
  346. if(Number(item) > Number(arr)){
  347. this.$message.warning(code +'上限不能小于每日'+ code)
  348. return true
  349. }
  350. }else{
  351. this.$message.warning( codes + '不为0时,'+ code +'上限不能为空')
  352. return true
  353. }
  354. }
  355. },
  356. deletedata(data,arr){
  357. data[arr] && data[arr] != 0 ? '' : delete data[arr]
  358. },
  359. // 提交
  360. saveFun(formName) {
  361. let self = this;
  362. let data = JSON.parse(JSON.stringify(self.formData));
  363. data.task_remark ? '' : delete data.task_remark;
  364. data.timeout_deduction_point ? '' : delete data.timeout_deduction_point;
  365. // if(data.timeout_deduction_point == ""){
  366. // data.timeout_deduction_point = null
  367. // }
  368. // if(data.task_remark == ""){
  369. // data.task_remark = null
  370. // }
  371. // if(data.task_cycle == 0){
  372. // delete data.task_cycle
  373. // delete data.task_expire_day
  374. // delete data.targets
  375. // data.task_remark?'':delete data.task_remark
  376. // data.timeout_deduction_point?'':delete data.timeout_deduction_point
  377. // }else{
  378. // delete data.expire_time
  379. // data.task_remark?'':delete data.task_remark
  380. // data.timeout_deduction_point?'':delete data.timeout_deduction_point
  381. // }
  382. if(!data.ahead_award_point && data.ahead_award_point_limit){
  383. this.$message.warning('奖分上限不为0时每日奖分不能为空')
  384. return
  385. }else if(data.ahead_award_point && !data.ahead_award_point_limit){
  386. this.$message.warning('每日奖分不为0时奖分上限不能为空')
  387. return
  388. }
  389. if(!data.timeout_deduction_point && data.timeout_deduction_point_limit){
  390. this.$message.warning('扣分上限不为0时每日扣分不能为空')
  391. return
  392. }else if(data.timeout_deduction_point && !data.timeout_deduction_point_limit){
  393. this.$message.warning('每日扣分不为0时扣分上限不能为空')
  394. return
  395. }
  396. if(this.ahead_timeout(data.ahead_award_point,data.ahead_award_point_limit,'提前奖分','奖分')) return
  397. if(this.ahead_timeout(data.timeout_deduction_point,data.timeout_deduction_point_limit,'逾期扣分','扣分')) return
  398. let add = ['ahead_award_point', 'ahead_award_point_limit', 'timeout_deduction_point', 'timeout_deduction_point_limit']
  399. add.forEach(item =>{
  400. this.deletedata(data,item)
  401. })
  402. this.forTheTaskLoading = true;
  403. self.$axios('post', '/api/integral/task/update', data)
  404. .then(res => {
  405. if (res.data.code == 1) {
  406. this.$parent.get_list();
  407. this.dept_selected = { dept: [], employee: [] };
  408. self.executorName = '';
  409. self.reviewerName = '';
  410. this.dept_name = [];
  411. self.$emit('update:dialogVisible', false);
  412. self.$refs[formName].resetFields();
  413. self.$message.success(res.data.msg);
  414. } else {
  415. self.$message.error(res.data.msg);
  416. }
  417. })
  418. .finally(() => {
  419. this.echoGather = [];
  420. setTimeout(() => {
  421. this.forTheTaskLoading = false;
  422. }, 300);
  423. });
  424. },
  425. // // 执行者
  426. // approval_confirm(data){
  427. // this.approval_selected = {dept: [],employee:[]}
  428. // this.formData.targets = []
  429. // this.executorName = ''
  430. // if (data.employee !== null && data.employee.length != 0) {
  431. // this.approval_selected = data
  432. // data.employee.forEach(element => {
  433. // this.formData.targets.push(element.id)
  434. // this.executorName += (element.name+',')
  435. // });
  436. // }
  437. // },
  438. // 执行者 end
  439. // 审核人
  440. reviewer_confirm(data) {
  441. this.reviewer_selected = { dept: [], employee: [] };
  442. this.formData.reviewer_id = '';
  443. this.reviewerName = '';
  444. if (data.employee !== null && data.employee.length != 0) {
  445. this.reviewer_selected = data;
  446. this.formData.reviewer_id = data.employee[0].id;
  447. this.reviewerName = data.employee[0].name;
  448. }
  449. this.show_reviewer_selector = false;
  450. },
  451. // 审核人 end
  452. // 部门可见
  453. dept_confirm(data) {
  454. this.dept_selected = { dept: [], employee: [] };
  455. this.formData.dept_ids = [];
  456. this.deptVisibleName = '';
  457. if (data.dept !== null && data.dept.length != 0) {
  458. this.dept_selected = data;
  459. data.dept.forEach(element => {
  460. this.formData.dept_ids.push(element.dept_id);
  461. this.deptVisibleName += element.dept_name + ',';
  462. });
  463. }
  464. },
  465. // 部门可见 end
  466. closeDialog() {
  467. this.echoGather = [];
  468. this.$emit('update:dialogVisible', false);
  469. },
  470. //获取部门
  471. getDepartment() {
  472. this.$axios('get', '/api/department/tree').then(res => {
  473. this.dept_tree = this.getTreeData(res.data.data.list);
  474. });
  475. },
  476. getTreeDatas(data, item) {
  477. for (let i in data) {
  478. if (data[i].id == item) {
  479. if (data[i].parentid == 1) {
  480. this.oneruleId.unshift(data[i].id);
  481. this.echoGather.push(this.oneruleId);
  482. this.oneruleId = [];
  483. break;
  484. } else {
  485. this.oneruleId.unshift(data[i].id);
  486. this.getTreeDatas(this.dept_tree, data[i].parentid);
  487. }
  488. } else {
  489. if (data[i]._child) {
  490. this.getTreeDatas(data[i]._child, item);
  491. }
  492. }
  493. }
  494. return;
  495. },
  496. // 递归判断列表,把最后的children设为undefined
  497. getTreeData(data) {
  498. for (var i = 0; i < data.length; i++) {
  499. if (data[i]._child.length < 1) {
  500. // children若为空数组,则将children设为undefined
  501. data[i]._child = undefined;
  502. } else {
  503. // children若不为空数组,则继续 递归调用 本方法
  504. this.getTreeData(data[i]._child);
  505. }
  506. }
  507. return data;
  508. }
  509. }
  510. };
  511. </script>
  512. <style></style>