bonusPointsPopup.vue 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791
  1. <template>
  2. <div>
  3. <!-- 奖扣ab分弹窗 -->
  4. <el-dialog
  5. :title="title"
  6. :visible.sync="visible"
  7. :close-on-click-modal="false"
  8. :before-close="closePopup"
  9. width="600px">
  10. <div>
  11. <!-- {{dialogData}} -->
  12. <el-form :model="dialogData" ref="dialogData" label-width="80px" v-loading="loading">
  13. <el-form-item label="录入对象" prop="members" :rules="[{ required: true, message: '请选择录入对象', trigger: 'change' }]">
  14. <el-row>
  15. <el-col :span="18">
  16. <el-input v-show="employeeNames.length==0" auto-complete="off" v-model="employeeName" placeholder="请选择录入对象"></el-input>
  17. <div v-if="employee_list.length > 0" @click="show_employee_selector = true" style=" position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
  18. <div v-if="employee_list.length > 0 && employeeNames.length>0" @click="show_employee_selector = true" class="zindexName">
  19. <span v-for="(item,index) in employeeNames" :key="index">
  20. <WWOpenData type="userName" :openid="item.name"></WWOpenData><span v-if="(employeeNames.length-index)>1">,</span>
  21. </span>
  22. </div>
  23. <div v-if="employee_list.length == 0" @click="noPersonnelListTips" style=" position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
  24. </el-col>
  25. </el-row>
  26. <!-- <EmployeeSelector
  27. :employee_not_select="employee_not_select"
  28. :employee_list="employee_list"
  29. :can_select_employee="true"
  30. :can_select_dept="false"
  31. :close_clear_data="false"
  32. :selected="employee_selected"
  33. :visible.sync="show_employee_selector"
  34. @confirm="move_employee_confirm"/> -->
  35. <EmployeeSelector
  36. :employee_not_select="employee_not_select"
  37. :user_employee_list="true"
  38. :employee_list="employee_list"
  39. :close_clear_data="false"
  40. :selected="employee_selected"
  41. :visible.sync="show_employee_selector"
  42. @confirm="move_employee_confirm"
  43. />
  44. </el-form-item>
  45. <div v-for="(item,index) in dialogData.items" :key="index" @click.stop="itemIndex = index">
  46. <div style="overflow: hidden;">
  47. <span style="line-height: 36px;">录入明细({{index+1}})</span>
  48. <el-button type="text" class="fr" v-show="index > 0 || dialogData.items.length > 1" @click="delItem(index)">删除</el-button>
  49. </div>
  50. <el-form-item label="指定规则">
  51. <el-switch
  52. @change="switchChange(index,item.rule_switch)"
  53. v-model="item.rule_switch"
  54. active-color="#13ce66">
  55. </el-switch>
  56. </el-form-item>
  57. <el-form-item class="test_cascader_id" label="选择分类" v-show="!item.rule_switch" :prop="'items.'+ index +'.rule_list_value'" :rules="[!item.rule_switch?{ required: true, message: '请选择规则分类', trigger: 'blur' }:{}]">
  58. <el-cascader
  59. v-model="item.rule_list_value"
  60. ref="ruleCascader"
  61. :popper-class="'ruleClass'"
  62. :options="rule_list"
  63. @change="ruleChange"
  64. :props="{ children: 'child', label: 'name', value: 'id', checkStrictly: true }"
  65. ></el-cascader>
  66. </el-form-item>
  67. <el-form-item label="选择规则" v-show="item.rule_switch" :prop="'items.'+ index +'.rule_item_list_value'" :rules="[item.rule_switch?{ required: true, message: '请选择规则', trigger: 'blur' }:{}]">
  68. <el-cascader
  69. v-model="item.rule_item_list_value"
  70. ref="ruleItem"
  71. :popper-class="'itemClass'"
  72. :options="rule_item_list"
  73. @change="ruleItemChange"
  74. :show-all-levels="false"
  75. :props="{ children: 'child', label: 'name', value: 'id'}"
  76. ></el-cascader>
  77. </el-form-item>
  78. <el-form-item>
  79. <div v-show="item.rule_item_details.range_type == 1">{{get_point_name(ptid)}} {{item.rule_item_details.min_point}}</div>
  80. <div v-show="item.rule_item_details.range_type == 2">{{get_point_name(ptid)}} {{item.rule_item_details.min_point}} ~ {{item.rule_item_details.max_point}}</div>
  81. <div>{{item.rule_item_details.name}}</div>
  82. </el-form-item>
  83. <el-form-item label="积分" :prop="'items.'+ index +'.point'" :rules="[{ required: true, message: '请输入分值', trigger: 'blur' }]">
  84. <el-input-number v-if="item.rule_item_details.range_type == 2" :min="item.min" :max="item.max" v-model="item.point" type="number"></el-input-number>
  85. <el-input-number v-else :disabled="item.rule_item_details.range_type == 1" v-model="item.point" type="number"></el-input-number>
  86. </el-form-item>
  87. <el-form-item label="发生时间" :prop="'items.'+ index +'.event_time'" :rules="[{ required: true, message: '请选择时间', trigger: 'blur' }]">
  88. <el-row>
  89. <el-col :span="18">
  90. <el-date-picker v-model="item.event_time" :picker-options="pickerBeginDateBefore" type="date" placeholder="请选择时间" value-format="yyyy-MM-dd"></el-date-picker>
  91. </el-col>
  92. </el-row>
  93. </el-form-item>
  94. <el-form-item label="事件内容" :prop="'items.'+ index +'.remark'" :rules="[{ required: true, message: '请输入事件内容', trigger: 'blur' },{ min: 3, max: 100, message: '长度在 3 到 100 个字符', trigger: 'blur' }]">
  95. <el-row>
  96. <el-col :span="18">
  97. <el-input type="textarea" rows="6" placeholder="请输入事件内容" style="width: 100%;" v-model="item.remark"></el-input>
  98. </el-col>
  99. </el-row>
  100. </el-form-item>
  101. <!-- 20200831 未处理完成 -->
  102. <el-form-item label="图片">
  103. <uploadOss
  104. :headers="Xtoken"
  105. class="avatar-uploader"
  106. :action="'https://'+'integralsys.oss-cn-shenzhen.aliyuncs.com'"
  107. :show-file-list="true"
  108. :file-list="item.fileList"
  109. :on-success="handleFilesSuccess"
  110. :on-preview="onFilePreView"
  111. :before-upload="beforeUpload"
  112. :on-remove="onFileRemove"
  113. :limit="3"
  114. :multiple="true"
  115. ref="clearPicture"
  116. >
  117. <el-button size="small" type="primary" >点击上传</el-button>(最多选择3张)
  118. <!-- <span>{{imageState}}</span> -->
  119. </uploadOss>
  120. </el-form-item>
  121. <el-form-item label="递交审批">
  122. <el-row>
  123. <el-col :span="18">
  124. <el-input v-show="item.approvalName==''" auto-complete="off" v-model="item.approvalName" placeholder="请选择审批人"></el-input>
  125. <div v-if="item.approvalName!=''" @click="item.show_approval_selector = true" class="zindexName">
  126. <WWOpenData type="userName" :openid="item.approvalName"></WWOpenData>
  127. </div>
  128. <div v-if="item.approvalName==''" @click="item.show_approval_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="item.approval_not_select"
  133. :can_select_employee="true"
  134. :can_select_dept="false"
  135. :multi="false"
  136. :employee_list="employee_lists"
  137. :selected="item.approval_selected"
  138. :visible.sync="item.show_approval_selector"
  139. @confirm="approval_confirm"/> -->
  140. <EmployeeSelector
  141. :employee_not_select="item.approval_not_select"
  142. :multi="false"
  143. :user_employee_list="true"
  144. :isChecKedAll="false"
  145. :is_filtration_creator="false"
  146. :employee_list="employee_lists"
  147. :selected="item.approval_selected"
  148. :visible.sync="item.show_approval_selector"
  149. @confirm="approval_confirm"
  150. />
  151. </el-form-item>
  152. </div>
  153. <el-form-item style="margin-bottom: 0;">
  154. <div>如需录入多条,请点击“增加一条”</div>
  155. </el-form-item>
  156. <el-form-item style="margin-bottom: 0;">
  157. <el-button type="primary" plain @click="addItem">+ 增加一条</el-button>
  158. </el-form-item>
  159. <el-form-item style="text-align: right; margin-bottom: 0;">
  160. <el-button @click="closeDialog('dialogData')" :disabled="btn_loading">取 消</el-button>
  161. <el-button type="primary" @click="subData('dialogData')" :disabled="btn_loading">确 认</el-button>
  162. </el-form-item>
  163. </el-form>
  164. </div>
  165. </el-dialog>
  166. <el-dialog
  167. :title="'提交结果'"
  168. :visible.sync="error_list_show"
  169. :append-to-body='true'
  170. @close='error_list_SX'
  171. width="700px">
  172. <el-table :data="error_list">
  173. <el-table-column prop="target" label="员工">
  174. <template slot-scope="scope">
  175. <WWOpenData type="userName" :openid="scope.row.target"></WWOpenData>
  176. </template>
  177. </el-table-column>
  178. <el-table-column prop="point" label="积分"></el-table-column>
  179. <el-table-column prop="status" label="处理状态">
  180. <template slot-scope="scope">
  181. <span :style="'color:'+(scope.row.status==0?'#f70000':'#47bf47')">{{scope.row.status==0?'提交失败':'提交成功'}}</span>
  182. </template>
  183. </el-table-column>
  184. <el-table-column prop="msg" label="备注信息"></el-table-column>
  185. </el-table>
  186. </el-dialog>
  187. </div>
  188. </template>
  189. <script>
  190. import moment from 'moment'
  191. import EmployeeSelector from '@/views/common/EmployeeSelector'
  192. // import EmployeeSelector from '@/views/common/EmployeeSelectorVTwo'
  193. import uploadOss from "@/views/upload_oss/upload"
  194. import { getToken } from '@/utils/auth'
  195. export default {
  196. name: 'bonusPointsForm',
  197. // 数据
  198. model: {
  199. prop: 'list',
  200. event: 'value'
  201. },
  202. props:{
  203. title: {
  204. type: String,
  205. default: ''
  206. },
  207. visible:{
  208. type: Boolean,
  209. default: false
  210. },
  211. refresh:{
  212. type: String,
  213. default: ''
  214. },
  215. integralType:{
  216. type: Number,
  217. default: 0
  218. // 1 是绩效分 , 2 是A分 , 3 是B分
  219. }
  220. },
  221. data() {
  222. return {
  223. pickerBeginDateBefore: {
  224. disabledDate(time) {
  225. return time.getTime() > Date.now();
  226. }
  227. },
  228. // imageState:'',
  229. error_list:[],//错误信息数组
  230. error_list_show:false,//错误信息弹窗
  231. Xtoken: { 'X-Token': getToken() },
  232. btn_loading: false,
  233. loading: false,
  234. dialogData:{
  235. members: [],
  236. items: [{
  237. rule_switch: true,
  238. rule_id: '',
  239. item_id: '',
  240. point: '0',
  241. remark: '',
  242. event_time: moment().format('YYYY-MM-DD'),
  243. approval: '',
  244. approval_not_select: [],
  245. pt_id: this.integralType,
  246. // 积分填写限制
  247. pointShow: 1,
  248. max:0,
  249. min:0,
  250. // 审批人信息
  251. reviewer_id: '',
  252. approvalName: '',
  253. approval_not_select: [],
  254. approval_selected: {dept: [],employee:[]},
  255. show_approval_selector: false,
  256. // 附件
  257. fileList: [],
  258. files: [],
  259. // 规则分类 与 规则细则 名称
  260. rule_list_value: null,
  261. rule_item_list_value: null,
  262. // 规则细则详情
  263. rule_item_details: {range_type:''},
  264. }]
  265. },
  266. // 录入对象名称
  267. employeeName: '',
  268. employeeNames: [],
  269. employee_not_select: [],
  270. employee_selected: {dept: [],employee:[]},
  271. employee_list: [],
  272. employee_lists: [],
  273. show_employee_selector: false,
  274. // 规则分类
  275. rule_list: [],
  276. // 规则细则
  277. rule_item_list: [],
  278. flatteningIntegralRules: null,
  279. ptid: 0,
  280. point_types: JSON.parse(localStorage.getItem('SET_POINT_TYPES')),
  281. itemIndex: 0,
  282. }
  283. },
  284. components: {EmployeeSelector,uploadOss},
  285. watch:{
  286. integralType(val){
  287. this.dialogData.items[0].pt_id = val
  288. this.ptid = val
  289. this.getRuleData()
  290. this.getRuleItemData()
  291. },
  292. 'dialogData.members'(val){
  293. if(val.length == 0){
  294. this.employeeName = ''
  295. this.employeeNames = []
  296. this.employee_selected = {dept: [],employee:[]}
  297. }
  298. }
  299. },
  300. mounted() {
  301. this.point_types = JSON.parse(localStorage.getItem('SET_POINT_TYPES'))
  302. this.employee_list = this.$store.getters.user_info.employee_detail.manage_scope
  303. console.log('this.employee_list')
  304. console.log(this.employee_list)
  305. this.employee_lists = this.$store.getters.user_info.employee_detail.superior_list
  306. },
  307. methods: {
  308. // 20200831 图片上传 未完成
  309. // 附件上传
  310. beforeUpload(file){
  311. const isJPG = /^image\/(jpeg|png|jpg)$/.test(file.type)
  312. const isLt2M = file.size / 1024 / 1024 < 1
  313. if (!isJPG) {
  314. this.$message.error('上传头像图片只能是 JPG 格式!')
  315. }
  316. if (!isLt2M) {
  317. this.$message.error('上传头像图片大小不能超过 2MB!')
  318. }
  319. return isJPG && isLt2M
  320. },
  321. onFilePreView(file) {
  322. window.open(file.response.url,'_blank')
  323. // // 点击时查看文件
  324. // debugger
  325. // const $ext_list = ['doc', 'docx', 'pptx', 'xls', 'xlsx', 'ppt', 'txt']
  326. // const $ext_name = file.name.split('.')[1]
  327. // if ($ext_list.indexOf($ext_name) >= 0) {
  328. // window.open(file.response.url,'_blank')
  329. // }
  330. // // 点击时查看图片
  331. // const $ext_list1 = ['jpg', 'png', 'bmp', 'jpeg','JPG','PNG']
  332. // const $ext_name1 = file.name.split('.')[1]
  333. // if ($ext_list1.indexOf($ext_name1) >= 0) {
  334. // let ii = 0
  335. // for (const i in this.dialogData.items[this.itemIndex].files) {
  336. // console.log(this.dialogData.items[this.itemIndex].files[i].split('.')[1])
  337. // debugger
  338. // if (['jpg', 'png', 'bmp', 'jpeg','JPG','PNG'].indexOf(this.dialogData.items[this.itemIndex].files[i].split('.')[1]) >= 0) {
  339. // if (this.dialogData.items[this.itemIndex].files[i] == file) {
  340. // this.openPhotoSwipe(ii,document.querySelectorAll('img[preview]'))
  341. // return
  342. // }
  343. // ii++
  344. // }
  345. // }
  346. // }
  347. },
  348. onFileRemove(file, fileList) {
  349. this.dialogData.items[this.itemIndex].fileList = fileList
  350. this.dialogData.items[this.itemIndex].files = []
  351. fileList.forEach((element,index) => {
  352. this.dialogData.items[this.itemIndex].files.push(element.url)
  353. });
  354. },
  355. handleFilesSuccess(response, file, fileList) {
  356. // this.imageState = '上传成功'
  357. this.dialogData.items[this.itemIndex].fileList = fileList
  358. this.dialogData.items[this.itemIndex].files = []
  359. fileList.forEach((element,index) => {
  360. this.dialogData.items[this.itemIndex].files.push(element.url)
  361. });
  362. },
  363. // 图片上传
  364. // 没有人员提示
  365. noPersonnelListTips(){
  366. this.$message.error('您没有管理范围,请联系管理员');
  367. },
  368. // 当switch 改变了
  369. switchChange(index,value){
  370. this.itemIndex = index
  371. const item = this.dialogData.items[this.itemIndex]
  372. if (!value) {
  373. item.rule_id = ""
  374. item.item_id = ""
  375. item.rule_item_list_value = ""
  376. item.rule_item_details = {range_type: ''}
  377. }else{
  378. item.rule_id = ""
  379. item.rule_list_value = ""
  380. }
  381. },
  382. // 选择录入对象
  383. move_employee_confirm(data){
  384. console.log(data)
  385. this.employeeNames = []
  386. this.employee_selected = {dept: [],employee:[]}
  387. this.employeeName = ''
  388. this.dialogData.members = []
  389. if (data.employee !== null && data.employee.length != 0) {
  390. this.employeeNames = data.employee
  391. let nameArr = []
  392. data.employee.forEach(element => {
  393. this.employeeName += element.name+','
  394. this.employee_selected = data
  395. this.dialogData.members.push(element.id)
  396. });
  397. }
  398. },
  399. // 获取规则信息
  400. getRuleData(){
  401. let self = this
  402. let data = {
  403. cycle_type: '1',
  404. pt_id: 2
  405. }
  406. this.integralType === 1?data.pt_id = '1':this.integralType === 2?data.pt_id = '2':data.pt_id = '3'
  407. self.$http('get','/api/integral/rule/trees',data
  408. ).then(res => {
  409. if (res.data.code == 1) {
  410. const resultData = res.data.data
  411. self.rule_list = resultData.rule_tree
  412. }
  413. self.rule_list = self.getTreeData(self.rule_list)
  414. }).catch(e => {self.$message.error(e.data.msg)})
  415. },
  416. // 获取规则细则
  417. getRuleItemData(){
  418. let self = this
  419. let data = {
  420. cycle_type: '1',
  421. pt_id: '1'
  422. }
  423. self.loading = true
  424. this.integralType === 1?data.pt_id = '1':this.integralType === 2?data.pt_id = '2':data.pt_id = '3'
  425. // const headers = {'Accept':'application/vnd.test.v2+json'}
  426. self.$http('get','/api/integral/rule/trees',data,'v2').then(res => {
  427. if (res.data.code == 1) {
  428. const resultData = res.data.data
  429. self.rule_item_list = resultData.tree
  430. self.flatteningIntegralRules = self.getItemDetail(self.rule_item_list)
  431. self.loading = false
  432. }
  433. }).catch(e => {self.$message.error(e.data.msg)})
  434. },
  435. // 规则细则变化关闭down
  436. ruleItemChange(value){
  437. let item = this.dialogData.items[this.itemIndex]
  438. let ruleItemDetails = null
  439. // this.flatteningIntegralRules.forEach(element => {
  440. // if (element.id == value[value.length - 1]) {
  441. // ruleItemDetails = {...element}
  442. // }
  443. // })
  444. ruleItemDetails = this.$refs["ruleItem"][this.itemIndex].getCheckedNodes()[0].data
  445. console.log(ruleItemDetails)
  446. if(ruleItemDetails){
  447. item.rule_item_details = ruleItemDetails
  448. item.remark = ruleItemDetails.name
  449. item.rule_id = ruleItemDetails.pid
  450. item.item_id = value[value.length - 1]
  451. }
  452. const user_info = this.$store.getters.user_info
  453. // if(item.reviewer_id){
  454. // item.pointShow = 2
  455. // }else{
  456. // item.pointShow = 1
  457. // if (ruleItemDetails.min_point === ruleItemDetails.max_point) {
  458. // user_info.point_config.point_limit.forEach(element => {
  459. // if(this.ptid == this.integralType){
  460. // item.max = element.point * 1
  461. // item.min = element.point * -1
  462. // }
  463. // });
  464. // }else{
  465. item.max = ruleItemDetails.max_point * 1
  466. item.min = ruleItemDetails.min_point * 1
  467. // }
  468. // }
  469. item.point = ruleItemDetails.min_point
  470. },
  471. // 规则分类变化关闭dewn
  472. ruleChange(value){
  473. const item = this.dialogData.items[this.itemIndex]
  474. const user_info = this.$store.getters.user_info
  475. user_info.point_config.point_limit.forEach(element => {
  476. if(this.ptid == this.integralType){
  477. item.max = element.point * 1
  478. item.min = element.point * -1
  479. }
  480. })
  481. this.$refs.ruleCascader.forEach(element => {
  482. element.dropDownVisible = false
  483. });
  484. item.rule_id = value[value.length - 1]
  485. },
  486. // 递归判断列表,把最后的child设为undefined
  487. getTreeData(data) {
  488. for (var i = 0; i < data.length; i++) {
  489. if (data[i].child.length < 1) {
  490. // child若为空数组,则将child设为undefined
  491. data[i].child = undefined;
  492. } else {
  493. // child若不为空数组,则继续 递归调用 本方法
  494. this.getTreeData(data[i].child);
  495. }
  496. }
  497. return data;
  498. },
  499. getItemDetail(arr) {//此递归暂不用,规则多的情况下会出问题
  500. let result = []
  501. for (const item of arr) {
  502. var res = JSON.parse(JSON.stringify(item)) // 先克隆一份数据作为第一层级的填充
  503. delete res['child']
  504. result.push(res)
  505. if (item.child instanceof Array && item.child.length > 0) { // 如果当前child为数组并且长度大于0,才可进入getItemDetail()方法
  506. result = result.concat(this.getItemDetail(item.child))
  507. }
  508. }
  509. return result
  510. },
  511. // 加一条
  512. addItem(){
  513. this.dialogData.items.push({
  514. rule_switch: true,
  515. rule_id: '',
  516. item_id: '',
  517. point: '0',
  518. remark: '',
  519. event_time: moment().format('YYYY-MM-DD'),
  520. approval: '',
  521. approval_not_select: [],
  522. pt_id: this.integralType,
  523. // 积分填写限制
  524. pointShow: 1,
  525. max:0,
  526. min:0,
  527. // 审批人信息
  528. reviewer_id: '',
  529. approvalName: '',
  530. approval_not_select: [],
  531. approval_selected: {dept: [],
  532. employee:[]},
  533. show_approval_selector: false,
  534. // 附件
  535. fileList: [],
  536. files: [],
  537. // 规则分类 与 规则细则 名称
  538. rule_list_value: null,
  539. rule_item_list_value: null,
  540. // 规则细则详情
  541. rule_item_details: {range_type:''},
  542. })
  543. },
  544. closeDialog(formName){
  545. this.dialogData.items.forEach(element => {
  546. element.rule_item_details = {range_type:''}
  547. });
  548. this.$refs[formName].resetFields();
  549. this.closePopup()
  550. // this.$emit('update:visible', false)
  551. },
  552. delItem(index){
  553. this.$confirm('你确定要删除奖扣明细'+parseInt(index+1)+'吗?', '提示', {
  554. confirmButtonText: '确定',
  555. cancelButtonText: '取消',
  556. type: 'warning'
  557. }).then(() => {
  558. this.dialogData.items.splice(index, 1)
  559. this.$message({
  560. type: 'success',
  561. message: '删除成功!'
  562. });
  563. }).catch(() => {});
  564. },
  565. subData(formName){
  566. this.$refs[formName].validate((valid) => {
  567. if (valid) {
  568. this.btn_loading = true
  569. this.save()
  570. }
  571. });
  572. },
  573. // 提交数据
  574. save(){
  575. let self = this
  576. let data = {
  577. members: self.dialogData.members,
  578. items: []
  579. }
  580. const user_info = this.$store.getters.user_info
  581. const index = user_info.point_config.point_limit.findIndex(o => o.pt_id === this.integralType)
  582. console.log(this.dialogData)
  583. let employeePointLimitMin = null
  584. let employeePointLimitMax = null
  585. user_info.point_config.point_limit.forEach(element => {
  586. if(self.ptid == this.integralType){
  587. employeePointLimitMax = element.point * 1
  588. employeePointLimitMin = element.point * 1
  589. }
  590. })
  591. const ruleLimitCheck = user_info.site_config.rule_limit_check
  592. let maxPointPermission = 0
  593. let creator = this.$store.getters.user_info.employee_detail.role_list.findIndex((item)=>item.name=='creator') >= 0
  594. if (user_info.point_config.point_limit.length > 0) {
  595. maxPointPermission = parseInt(user_info.point_config.point_limit[index].point)
  596. }else{
  597. if (creator) {
  598. maxPointPermission = -1
  599. }
  600. }
  601. // 手机端逻辑
  602. // || (user_info.is_creator !== 1 && maxPointPermission == 0)
  603. try{
  604. if(index < 0 || user_info.is_creator === 1){
  605. self.dialogData.items.forEach((element,i) => {
  606. data.items.push({rule_id: element.rule_id || 0, item_id: element.item_id || 0, point: element.point, remark: element.remark, event_time: element.event_time, pt_id: self.ptid, reviewer_id: element.reviewer_id || 0, files: element.files})
  607. })
  608. }
  609. // else if(user_info.is_creator !== 1 && maxPointPermission == 0){
  610. // console.log(user_info)
  611. // this.$message.error('您的积分权限不足,请联系管理员');
  612. // throw new Error()
  613. // }
  614. else{
  615. self.dialogData.items.forEach((element,index) => {
  616. !element.reviewer_id?element.reviewer_id = 0:''
  617. !element.item_id?element.item_id = 0:''
  618. if(
  619. (element.reviewer_id && element.point !== 0 && element.rule_id > 0) ||
  620. (element.reviewer_id <= 0 && element.item_id > 0 && ruleLimitCheck && element.point !== 0 && element.point <= maxPointPermission && Math.abs(element.point) <= maxPointPermission) ||
  621. (element.reviewer_id <= 0 && !ruleLimitCheck && this.integralType == 3 && element.rule_id > 0) ||
  622. (element.reviewer_id <= 0 && element.item_id >= 0 && element.point !== 0 && element.point <= maxPointPermission && Math.abs(element.point) <= maxPointPermission && element.rule_id > 0 )
  623. ){
  624. data.items.push({rule_id: element.rule_id || 0, item_id: element.item_id || 0, point: element.point, remark: element.remark, event_time: element.event_time, pt_id: self.ptid, reviewer_id: element.reviewer_id || 0, files: element.files})
  625. }else{
  626. this.$message.error('第'+ (index+1) +'条输入积分分值超出权限,请选择审批人递交');
  627. throw new Error()
  628. }
  629. })
  630. }
  631. } catch(e) {
  632. this.btn_loading = false
  633. return false
  634. }
  635. self.$http('post',this.integralType === 1?'':this.integralType === 2?'/api/integral/review/a/entry':'/api/integral/point/entry',data
  636. ).then(res => {
  637. if(res.data.code == 1){
  638. this.dialogData.items.forEach(element => {
  639. element.rule_item_details = {range_type:''}
  640. })
  641. self.$refs['dialogData'].resetFields();
  642. self.$emit('update:visible', false)
  643. self.$emit('update:refresh', this.$moment().format().valueOf())
  644. self.$message.success(res.data.msg)
  645. this.closePopup()
  646. this.error_list = res.data.data.list
  647. this.error_list_show = true
  648. }else{
  649. self.$message.error(res.data.msg)
  650. }
  651. }).catch(e => {self.$message.close()})
  652. this.$nextTick(() => {
  653. self.btn_loading = false
  654. })
  655. },
  656. //关闭错误信息时的回调
  657. error_list_SX(){
  658. // this.loadBaseData();
  659. // this.loadEmployeeList()
  660. },
  661. // 选择审核人
  662. approval_confirm(data){
  663. const item = this.dialogData.items[this.itemIndex]
  664. item.approvalName = ''
  665. item.approval_selected.employee = []
  666. item.reviewer_id = ''
  667. if (data.employee !== null && data.employee.length != 0) {
  668. item.approvalName = data.employee[0].name
  669. item.approval_selected.employee = [{name: data.employee[0].name,id:data.employee[0].id,img_url: data.employee[0].img_url}]
  670. item.reviewer_id = data.employee[0].id
  671. }
  672. item.reviewer_id?item.pointShow = 3:''
  673. },
  674. // 获取积分名称
  675. get_point_name(id){
  676. let name = ''
  677. this.point_types.forEach(element => {
  678. if (element.id == id) {
  679. name = element.name
  680. }
  681. });
  682. return name
  683. },
  684. // 关闭弹窗
  685. closePopup(){
  686. //关闭重置窗口状态
  687. this.dialogData.items = [{
  688. rule_switch: true,
  689. rule_id: '',
  690. item_id: '',
  691. point: '0',
  692. remark: '',
  693. event_time: moment().format('YYYY-MM-DD'),
  694. approval: '',
  695. approval_not_select: [],
  696. pt_id: this.integralType,
  697. // 积分填写限制
  698. pointShow: 1,
  699. max:0,
  700. min:0,
  701. // 审批人信息
  702. reviewer_id: '',
  703. approvalName: '',
  704. approval_not_select: [],
  705. approval_selected: {dept: [],employee:[]},
  706. show_approval_selector: false,
  707. // 附件
  708. fileList: [],
  709. files: [],
  710. // 规则分类 与 规则细则 名称
  711. rule_list_value: null,
  712. rule_item_list_value: null,
  713. // 规则细则详情
  714. rule_item_details: {range_type:''},
  715. }]
  716. // console.log('关闭前')
  717. this.$emit('update:visible', false)
  718. // this.employeeName = '';//input置空
  719. // this.employee_selected = {dept: [],employee:[]};//传入的已选择人员 置空
  720. // this.$refs.clearPicture[0].clearPictures()//清空已选图片
  721. // if(this.dialogData.items[0].rule_switch){
  722. // this.$refs.ruleItem[0].$refs.panel.clearCheckedNodes(); //清空选中的节点
  723. // this.$refs.ruleItem[0].$refs.panel.activePath = []; //设置为空可以让节点不高亮显示
  724. // }else{
  725. // this.$refs.ruleCascader[0].$refs.panel.clearCheckedNodes(); //清空选中的节点
  726. // this.$refs.ruleCascader[0].$refs.panel.activePath = []; //设置为空可以让节点不高亮显示
  727. // }
  728. // console.log(this.dialogData.items[0].rule_item_details)
  729. // console.log(this.dialogData.items[0].rule_item_details.remark = '')
  730. // this.dialogData.items[0].rule_item_details = {range_type: ''}
  731. // this.dialogData.items[0].rule_switch = false,
  732. // this.dialogData.items.splice(1, 100)
  733. },
  734. }
  735. }
  736. </script>
  737. <style lang="scss">
  738. .itemClass .el-cascader-menu .el-cascader-menu__wrap .el-scrollbar__view li.el-cascader-node{
  739. height: auto;
  740. max-width: 500px;
  741. .el-cascader-node__label{
  742. white-space: initial;
  743. overflow: initial;
  744. text-overflow: initial;
  745. }
  746. }
  747. .zindexName{
  748. position: absolute;
  749. top: 0;
  750. right: 0;
  751. left: 0;
  752. bottom: 0;
  753. z-index: 9;
  754. border:1px solid rgb(224, 224, 224);
  755. width:360px;
  756. border-radius:3px;
  757. padding-left:15px;
  758. overflow: hidden;
  759. }
  760. // ruleClass
  761. // itemClass
  762. </style>