rewardTaskAmend.vue 22 KB

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