applicationIntegrationPopup.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685
  1. <template>
  2. <div>
  3. <el-dialog :title="title" top="60px" :visible.sync="visible" :close-on-click-modal="false" :before-close="closePopup" @open="openDialog" width="800px" >
  4. <div>
  5. <el-form :model="dialogData" style="max-height: 600px;overflow-y: scroll;padding-right: 20px;" ref="dialogData" label-width="100px" v-loading="loading" class="form">
  6. <el-form-item label="录入对象" :rules="[{ required: true, message: '请选择录入对象'}]">
  7. <el-input class="w250" auto-complete="off" v-model="employeeName" placeholder="请选择录入对象"></el-input>
  8. <div @click="show_employee_selector = true" style=" position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
  9. <EmployeeSelector
  10. :isChecKedAll="false"
  11. :multi="false"
  12. :selected="employee_selected"
  13. :visible.sync="show_employee_selector"
  14. @confirm="employee_confirm"
  15. />
  16. </el-form-item>
  17. <el-form-item label="指定规则">
  18. <template slot="label">
  19. <span>指定规则</span>
  20. <el-tooltip placement="top">
  21. <div slot="content" style="width: 450px;">指定规则:根据公司已经制定好的积分规则标准事由来进行奖扣或申请积分<br/>不指定规则:可以自由填写事由(即积分规则标准以外的内容)进行奖扣或申请积分</div>
  22. <span class="tips">?</span>
  23. </el-tooltip>
  24. </template>
  25. <el-switch :disabled="specified_rule_item" @change="switchChange(dialogData.rule_switch)" v-model="dialogData.rule_switch" active-color="#13ce66"></el-switch>
  26. </el-form-item>
  27. <el-form-item label="选择规则" v-show="dialogData.rule_switch">
  28. <div class="inputBox" @click="isShowRule = true">
  29. <span v-if="dialogData.items.length > 0">已选择了{{dialogData.items.length}}条</span>
  30. <span v-else style="color: #909399;">请选择</span>
  31. </div>
  32. </el-form-item>
  33. <div v-for="(item, index) in dialogData.items" :key="index" @click.stop="setIndex(index)" style="margin-bottom: 10px;">
  34. <div class="title flex-box-ce" style="margin-bottom: 16px;" v-if="item.item_id">
  35. <span style="line-height: 36px; width: 100px;text-align: right;padding-right: 12px;font-weight: 700;">已选规则({{ index + 1 }})</span>
  36. <div class="flex-1"></div>
  37. <el-link type="danger" v-show="(index > 0 || dialogData.items.length > 1) && dialogData.rule_switch" @click="delItem(item.item_id,index)">删除</el-link>
  38. </div>
  39. <el-form-item label="积分规则" v-if="item.item_id">
  40. <div style="line-height: 24px;background-color: #E4F0FC;border-radius: 3px;padding:8px 10px;">
  41. <div>{{ item.ruleData.remark }}</div>
  42. <div v-if="item.ruleData.range_type == 1">
  43. <span :class="item.ruleData.min_point > 0 ? 'red' : 'green'">{{ item.ruleData.min_point }}</span>
  44. {{ $getTypsName(item.ruleData.pt_id) }}
  45. </div>
  46. <div v-if="item.ruleData.range_type == 2">
  47. <span :class="item.ruleData.min_point > 0 ? 'red' : 'green'">{{ item.ruleData.min_point }}</span>
  48. <span :class="item.ruleData.max_point > 0 ? 'red' : 'green'">{{ item.ruleData.max_point }}</span>
  49. {{ $getTypsName(item.ruleData.pt_id) }}
  50. </div>
  51. </div>
  52. </el-form-item>
  53. <el-form-item
  54. label="事件内容"
  55. :prop="'items.' + index + '.remark'"
  56. :rules="[{ required: true, message: '请输入事件内容'}, { min: 2, max: 300, message: '长度在 2 到 300 个字符'}]"
  57. >
  58. <el-input type="textarea" clearable maxlength="300" show-word-limit rows="4" placeholder="请输入事件内容" v-model="item.remark" @input="onRemarkInput(item)"></el-input>
  59. <el-button @click="item.remark=''" type="danger" plain size="mini" style="position: absolute;right: 0px;bottom: -30px;z-index: 99999;">清空</el-button>
  60. </el-form-item>
  61. <el-form-item label="图片" style="margin-top: 30px;">
  62. <uploadOss
  63. :headers="$xtoken"
  64. class="avatar-uploader"
  65. :action="'https://' + 'integralsys.oss-cn-shenzhen.aliyuncs.com'"
  66. :show-file-list="true"
  67. :file-list="item.fileList"
  68. :on-success="handleFilesSuccess"
  69. :on-preview="onFilePreView"
  70. :before-upload="beforeUpload"
  71. :on-remove="onFileRemove"
  72. :limit="3"
  73. list_type="picture-card"
  74. :accept="$acceptImg"
  75. :multiple="true"
  76. ref="clearPicture"
  77. >
  78. <i class="el-icon-plus"></i>
  79. </uploadOss>
  80. </el-form-item>
  81. <el-form-item label="发生时间" :prop="'items.' + index + '.event_time'" :rules="[{ required: true, message: '请选择时间'}]">
  82. <el-date-picker :clearable="false" class="w250" v-model="item.event_time" :picker-options="pickerBeginDateBefore" type="date" placeholder="请选择时间" value-format="yyyy-MM-dd"></el-date-picker>
  83. </el-form-item>
  84. <el-form-item label="递交审批" v-if="!isCreator">
  85. <el-input class="w250" auto-complete="off" :disabled="change_reviewer" v-model="item.approvalName" placeholder="请选择审批人"></el-input>
  86. <div v-if="!change_reviewer" @click="item.show_approval_selector = true" style=" position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
  87. <EmployeeSelector
  88. :multi="false"
  89. :user_employee_list="true"
  90. :isChecKedAll="false"
  91. :is_filtration_creator="false"
  92. :employee_list="superiorList"
  93. :selected="item.approval_selected"
  94. :visible.sync="item.show_approval_selector"
  95. @confirm="approval_confirm"
  96. />
  97. </el-form-item>
  98. </div>
  99. </el-form>
  100. <div class="flex-box-end">
  101. <el-button @click="closeDialog('dialogData')" :disabled="btn_loading">取 消</el-button>
  102. <el-button type="primary" @click="subData('dialogData')" :disabled="btn_loading">确 认</el-button>
  103. </div>
  104. </div>
  105. </el-dialog>
  106. <el-dialog :close-on-click-modal="false" :title="'提交结果'" :visible.sync="error_list_show" :append-to-body="true" width="600px">
  107. <el-table :data="error_list">
  108. <el-table-column prop="target" label="员工"></el-table-column>
  109. <el-table-column prop="point" label="积分"></el-table-column>
  110. <el-table-column prop="msg" label="备注信息"></el-table-column>
  111. <el-table-column prop="status" label="处理状态">
  112. <template slot-scope="scope">
  113. <span :style="'color:' + (scope.row.status === 0 ? '#f70000' : '#47bf47')">{{ scope.row.status === 0 ? '申请失败' : '申请成功' }}</span>
  114. </template>
  115. </el-table-column>
  116. </el-table>
  117. </el-dialog>
  118. <SelectRule
  119. :visible.sync="isShowRule"
  120. :ptId="0"
  121. :selectItems="selectItem"
  122. :is-scope="true"
  123. @confirm="ruleConfirm"
  124. />
  125. <el-dialog title="提交结果" :visible.sync="isResult" width="1000" :close-on-click-modal="false" :close-on-press-escape="false" :show-close="false">
  126. <div v-if="!isShowError">
  127. <div style="text-align: center;margin-bottom: 10px;" class="red" v-if="isShowError2">{{errorMsg}}</div>
  128. <el-progress :text-inside="true" :stroke-width="24" :percentage="percentage"></el-progress>
  129. <div style="margin-top: 20px;border: 1px solid #f1f1f1;max-height: 500px;overflow-y: auto;" class="scroll-bar">
  130. <div class="flex-box-ce results" style="font-weight: 600;">
  131. <div style="border-right: 1px solid #f1f1f1;width: 50px;">序号</div>
  132. <div class="flex-1" style="border-right: 1px solid #f1f1f1;">申请对象</div>
  133. <div class="flex-3" style="border-right: 1px solid #f1f1f1;">事件内容</div>
  134. <!-- <div class="flex-1" style="border-right: 1px solid #f1f1f1;">积分</div> -->
  135. <div class="flex-2" >处理结果</div>
  136. </div>
  137. <div class="flex-box-ce results" v-for="(item, index) in results" :key="index">
  138. <div style="border-right: 1px solid #f1f1f1;width: 50px;">{{results.length-index}}</div>
  139. <div class="flex-1" style="border-right: 1px solid #f1f1f1;">{{ item.target }}</div>
  140. <div class="flex-3 content" style="border-right: 1px solid #f1f1f1;">
  141. <el-tooltip class="item" effect="dark" :content="item.task.msg.remark" placement="bottom">
  142. <div class="content">{{ item.task.msg.remark }}</div>
  143. </el-tooltip>
  144. </div>
  145. <div class="flex-2" v-if="item.status == 1">
  146. <span class="green">{{ item.msg }}</span>
  147. </div>
  148. <div class="flex-2 red" v-else>{{ item.msg }}</div>
  149. </div>
  150. </div>
  151. <span slot="footer">
  152. <div class="flex-box-end" style="margin-top: 20px;" v-show="isShowError2&&results.length!=resultList.length"><el-button type="primary" @click="isResult = false" size="small">确 定</el-button></div>
  153. <div class="flex-box-end" style="margin-top: 20px;" v-show="results.length==resultList.length"><el-button type="primary" @click="isResult = false" size="small">确 定</el-button></div>
  154. </span>
  155. </div>
  156. <div v-else>
  157. <div style="text-align: center;" class="red">{{errorMsg}}</div>
  158. <span slot="footer">
  159. <div class="flex-box-end" style="margin-top: 20px;"><el-button type="primary" @click="isResult = false" size="small">确 定</el-button></div>
  160. </span>
  161. </div>
  162. </el-dialog>
  163. </div>
  164. </template>
  165. <script>
  166. import moment from 'moment';
  167. import EmployeeSelector from '@/components/EmployeeSelector';
  168. import uploadOss from '@/components/upload';
  169. import SelectRule from '@/components/SelectRule';
  170. import {specialFilter} from "../../../utils";
  171. export default {
  172. name: 'applicationIntegration',
  173. // 数据
  174. model: {
  175. prop: 'list',
  176. event: 'value'
  177. },
  178. props: {
  179. title: {
  180. type: String,
  181. default: ''
  182. },
  183. visible: {
  184. type: Boolean,
  185. default: false
  186. },
  187. integralType: {
  188. type: Number,
  189. default: 0
  190. }
  191. },
  192. data() {
  193. return {
  194. pickerBeginDateBefore: {
  195. disabledDate(time) {
  196. // 获取60天前得日期
  197. var date = new Date()
  198. var lastDate = new Date(date - 1000 * 60 * 60 * 24 * 60)// 最后60天可以更改,意义:是获取多少天前的时间
  199. var lastY = lastDate.getFullYear()
  200. var lastM = lastDate.getMonth()
  201. var lastD = lastDate.getDate()
  202. let oneYear = new Date(lastY, (lastM < 10 ? '0' + lastM : lastM), (lastD < 10 ? '0' + lastD : lastD))
  203. return time.getTime() > Date.now() || time.getTime() < oneYear;
  204. }
  205. },
  206. error_list: [], //错误信息数组
  207. error_list_show: false, //错误信息弹窗
  208. loading: false,
  209. isShowRule: false,
  210. selectItem: [],
  211. dialogData: {
  212. items: [],
  213. rule_switch: true,
  214. },
  215. item:{
  216. rule_id: '',
  217. item_id: '',
  218. remark: '',
  219. ruleData:{},
  220. event_time: moment().format('YYYY-MM-DD'),
  221. // 审批人信息
  222. reviewer_id: '',
  223. approvalName: '',
  224. approval_not_select: [],
  225. approval_selected: { dept: [], employee: [] },
  226. show_approval_selector: false,
  227. // 附件
  228. fileList: [],
  229. files: [],
  230. },
  231. // 录入对象
  232. employee_id: '',
  233. employeeName: '',
  234. employee_list: [],
  235. superiorList: [],//当前录入对象上级
  236. employee_selected: { dept: [], employee: [] },
  237. show_employee_selector: false,
  238. // 规则分类
  239. user_info: this.$store.getters.user_info,
  240. btn_loading: false,
  241. itemIndex:0,
  242. change_reviewer:Number(this.$store.getters.user_info.site_config.change_reviewer)==1? true:false,//是否允许员工修改审批人
  243. isCreator:this.$supremeAuthority('creator'),
  244. // 长连接结果
  245. results: [], //提交的返回结果集合
  246. isResult: false,
  247. percentage: 0,
  248. resultList:[],//要发送数据的集合
  249. resultIndex:0,
  250. isShowError:false,
  251. isShowError2:false,
  252. errorMsg:'服务器繁忙,请稍后再试',
  253. breakList:[],
  254. config:{},
  255. specified_rule_item:this.$userInfo().site_config.specified_rule_item? true:false,//奖扣时是否必选规则
  256. };
  257. },
  258. components: { EmployeeSelector, uploadOss,SelectRule },
  259. watch:{
  260. isResult(val){
  261. if(!val){
  262. this.isShowError = false;
  263. this.isShowBreak = false;
  264. this.$refs['dialogData'].resetFields();
  265. this.$emit('update:refresh',this.$moment().format().valueOf());
  266. this.closePopup();
  267. this.errorMsg='服务器繁忙,请稍后再试';
  268. this.$socketApi.closewebsocket();
  269. }
  270. },
  271. },
  272. methods: {
  273. //判断是否已经存在
  274. isItemId(id){
  275. let item='';
  276. this.dialogData.items.some((x)=> {
  277. if(x.item_id==id){
  278. item=x
  279. return true;
  280. }
  281. });
  282. return item
  283. },
  284. //选择规则
  285. ruleConfirm(rules) {
  286. if (rules.length > 0) {
  287. let items = []
  288. rules.forEach(e => {
  289. if(this.isItemId(e.id)){
  290. items.push(this.isItemId(e.id))
  291. }else{
  292. let item = JSON.parse(JSON.stringify(this.item));
  293. item.remark = specialFilter(e.remark);
  294. item.rule_id = e.rule_id;
  295. item.item_id = e.id;
  296. item.ruleData= e;
  297. items.push(item);
  298. }
  299. });
  300. this.dialogData.items = items;
  301. } else {
  302. this.dialogData.items = [];
  303. }
  304. this.selectItem = rules;
  305. },
  306. setIndex(index){
  307. if(index==this.itemIndex){
  308. return false
  309. }
  310. this.itemIndex = index;
  311. },
  312. openDialog(){
  313. // 初始化录入对象
  314. this.employee_selected.employee = [{ id: this.user_info.id, img_url: this.user_info.img_url, name: this.user_info.name }];
  315. this.employee_id = this.user_info.id;
  316. this.employeeName = this.user_info.name;
  317. this.initializesReviewer(this.user_info.id);
  318. },
  319. // 附件上传
  320. beforeUpload(file) {
  321. const isJPG = /^image\/(jpeg|png|jpg)$/.test(file.type);
  322. const isLt2M = file.size / 1024 / 1024 < 5;
  323. if (!isJPG) {
  324. this.$message.error('上传图片只能是 JPG,PNG,JPEG 格式!');
  325. }
  326. if (!isLt2M) {
  327. this.$message.error('上传图片大小不能超过 5MB!');
  328. }
  329. return isJPG && isLt2M;
  330. },
  331. onFilePreView(file) {
  332. window.open(file.response.url, '_blank');
  333. },
  334. onFileRemove(file, fileList) {
  335. this.dialogData.items[this.itemIndex].fileList = fileList;
  336. this.dialogData.items[this.itemIndex].files = [];
  337. fileList.forEach((element, index) => {
  338. this.dialogData.items[this.itemIndex].files.push(element.url);
  339. });
  340. },
  341. handleFilesSuccess(response, file, fileList) {
  342. let fileListData=fileList.filter(e=>{
  343. return e.url
  344. })
  345. this.dialogData.items[this.itemIndex].fileList = fileListData;
  346. this.dialogData.items[this.itemIndex].files = [];
  347. fileListData.forEach((element, index) => {
  348. this.dialogData.items[this.itemIndex].files.push(element.url);
  349. });
  350. },
  351. delItem(id,index) {
  352. this.$confirm('你确定要删除奖扣明细' + parseInt(index + 1) + '吗?', '提示', {
  353. confirmButtonText: '确定',
  354. cancelButtonText: '取消',
  355. type: 'warning'
  356. }).then(() => {
  357. this.dialogData.items.splice(index, 1);
  358. this.selectItem.some((e,index2)=>{
  359. if(id==e.id){
  360. this.selectItem.splice(index2, 1);
  361. return true;
  362. }
  363. })
  364. this.$message({
  365. type: 'success',
  366. message: '删除成功!'
  367. });
  368. })
  369. .catch(() => {});
  370. },
  371. closeDialog(formName) {
  372. this.$refs[formName].resetFields();
  373. this.closePopup();
  374. },
  375. subData(formName) {
  376. this.$refs[formName].validate(valid => {
  377. if (valid) {
  378. this.save();
  379. }
  380. });
  381. },
  382. // 提交数据
  383. save() {
  384. let self = this;
  385. let data = [];
  386. let isError=false;
  387. let str='';
  388. self.dialogData.items.some((element,index) => {
  389. data.push({
  390. rule_id: element.rule_id || 0,
  391. employee_id: this.employee_id || 0,
  392. item_id: element.item_id || 0,
  393. remark: element.remark,
  394. event_time: element.event_time,
  395. pt_id: element.ruleData.pt_id,
  396. reviewer_id: element.reviewer_id || 0,
  397. files: element.files,
  398. type:'point_apply'
  399. });
  400. if(!element.reviewer_id){
  401. isError=true;
  402. str="第"+(index+1)+'条申请,审批人不能为空'
  403. }
  404. });
  405. if(!this.employee_id){
  406. this.$message.error('请选择录入对象');
  407. return false;
  408. }
  409. if(!data[0]){
  410. this.$message.error('请选择规则');
  411. return false;
  412. }
  413. if(isError){
  414. this.$message.error(str);
  415. return false;
  416. }
  417. // if(data[0]&&data[0].item_id){
  418. this.webSocket(data);
  419. return false;
  420. // }
  421. this.btn_loading = true;
  422. let obj={items:data}
  423. this.$axiosUser('post', '/api/pro/integral/review/apply', obj, 'v2').then(res => {
  424. if (res.data.code == 1) {
  425. self.$refs['dialogData'].resetFields();
  426. self.$message.success(res.data.msg);
  427. this.error_list = res.data.data.list;
  428. this.error_list_show = true;
  429. this.closePopup();
  430. } else {
  431. self.$message.error(res.data.msg);
  432. }
  433. self.btn_loading = false;
  434. });
  435. },
  436. webSocket(data){
  437. this.resultList=data;
  438. this.resultIndex=0;
  439. this.percentage=0;
  440. this.results=[];
  441. this.isResult=true;
  442. this.opneWebSocket()
  443. },
  444. opneWebSocket() {
  445. let wsData=this.resultList;
  446. if(wsData[this.resultIndex]&&!this.isShowError){
  447. this.$socketApi.sendData(wsData[this.resultIndex],this.onmessageWS)
  448. }
  449. },
  450. onmessageWS(e){
  451. if(e.type=='point_apply'){
  452. this.results.unshift(e.result);
  453. this.resultIndex++;
  454. this.opneWebSocket();
  455. // 进度条
  456. let lng = this.resultList.length;
  457. this.percentage += Math.floor(100 / lng);
  458. if (lng == this.results.length) {
  459. this.percentage = 100;
  460. }
  461. }
  462. // 中途断开
  463. if(e.type=='break'){
  464. let wsData=this.resultList;
  465. this.errorMsg=e.msg
  466. let data={
  467. type:this.ptId,
  468. obj:wsData.slice(this.resultIndex,wsData.length)
  469. }
  470. this.$setCache('award_punish',data);
  471. this.isShowError2 = true;
  472. }
  473. // 连接不上
  474. if(e.type=='error'){
  475. this.errorMsg=e.msg
  476. this.isShowError = true;
  477. }
  478. },
  479. // 当switch 改变了
  480. switchChange(is) {
  481. this.selectItem=[];
  482. if(is){
  483. this.dialogData.items=[];
  484. }else{
  485. this.dialogData.items=[JSON.parse(JSON.stringify(this.item))];
  486. }
  487. },
  488. // 初始化审核人
  489. initializesReviewer(id) {
  490. var superiorList=this.$getEmployeeMapItem(id).employee_detail.superior_list;//选择录入对象的上级集合
  491. this.superiorList=superiorList;//当前选中人的 上级
  492. let obj = this.item;
  493. this.$axiosUser('get','/api/pro/employee/superior',{employee_id:id,manage_scope: '1',platform:"1"}).then(res => {
  494. var list=res.data.data.list;
  495. var users= [...list].filter(x => [...superiorList].some(y => y.id === x.id));//获取录入对象的上级与直属上级的交集
  496. if(users.length>0){
  497. obj.approvalName = users[0].name;
  498. obj.approval_selected.employee = [{ name:users[0].name, id:users[0].id, img_url: users[0].img_url }];
  499. obj.reviewer_id = users[0].id;
  500. }else{
  501. obj.approvalName = list[0].name;
  502. obj.approval_selected.employee = [{ name:list[0].name, id:list[0].id, img_url:'' }];
  503. obj.reviewer_id = list[0].id;
  504. }
  505. this.dialogData.items.forEach(item=>{
  506. if(users.length>0){
  507. item.approvalName = users[0].name;
  508. item.approval_selected.employee = [{ name:users[0].name, id:users[0].id, img_url: users[0].img_url }];
  509. item.reviewer_id = users[0].id;
  510. }else{
  511. item.approvalName = list[0].name;
  512. item.approval_selected.employee = [{ name:list[0].name, id:list[0].id, img_url:'' }];
  513. item.reviewer_id = list[0].id;
  514. }
  515. })
  516. });
  517. },
  518. // 选择审核人
  519. approval_confirm(data) {
  520. const item = this.dialogData.items[this.itemIndex];
  521. item.approvalName = '';
  522. item.approval_selected.employee = [];
  523. item.reviewer_id = '';
  524. if (data.employee !== null && data.employee.length != 0) {
  525. item.approvalName = data.employee[0].name;
  526. item.approval_selected.employee = [{ name: data.employee[0].name, id: data.employee[0].id, img_url: data.employee[0].img_url }];
  527. item.reviewer_id = data.employee[0].id;
  528. }
  529. },
  530. // 选择对象
  531. employee_confirm(data) {
  532. if (data.employee !== null && data.employee.length != 0) {
  533. let user=data.employee[0];
  534. this.employeeName = user.name;
  535. this.employee_selected.employee = [{ name: user.name, id: user.id, img_url: user.img_url }];
  536. this.employee_id = user.id;
  537. this.initializesReviewer(user.id);
  538. }else{
  539. this.employeeName = '';
  540. this.employee_selected.employee = [];
  541. this.employee_id = '';
  542. }
  543. },
  544. // 关闭弹窗
  545. closePopup() {
  546. //关闭重置窗口状态
  547. this.itemIndex=0;
  548. this.$nextTick(()=>{
  549. this.selectItem=[];
  550. this.dialogData={
  551. items: [],
  552. rule_switch: true,
  553. };
  554. this.item={
  555. rule_id: '',
  556. item_id: '',
  557. remark: '',
  558. ruleData:{},
  559. event_time: moment().format('YYYY-MM-DD'),
  560. // 审批人信息
  561. reviewer_id: '',
  562. approvalName: '',
  563. approval_not_select: [],
  564. approval_selected: { dept: [], employee: [] },
  565. show_approval_selector: false,
  566. // 附件
  567. fileList: [],
  568. files: [],
  569. };
  570. })
  571. this.$emit('update:visible', false);
  572. },
  573. onRemarkInput(item){
  574. item.remark = specialFilter(item.remark)
  575. }
  576. }
  577. };
  578. </script>
  579. <style lang="scss" scoped="scoped">
  580. .tips {
  581. background: #606266;
  582. border-radius: 50%;
  583. width: 14px;
  584. height: 14px;
  585. color: #fff;
  586. display: inline-block;
  587. font-size: 12px;
  588. line-height: 14px;
  589. text-align: center;
  590. }
  591. .title{
  592. background-color: #F4F9FD;
  593. border: 1px solid #E4F0FC;
  594. padding-right: 10px;
  595. }
  596. .content {
  597. display: -webkit-box;
  598. -webkit-box-orient: vertical;
  599. -webkit-line-clamp: 2;
  600. overflow: hidden;
  601. padding: 0 10px !important;
  602. line-height: 1.5rem;
  603. }
  604. .results {
  605. border-bottom: 1px solid #f1f1f1;
  606. text-align: center;
  607. }
  608. .results div {
  609. padding: 10px;
  610. }
  611. .w250{
  612. width: 400px;
  613. }
  614. .inputBox {
  615. height: 36px;
  616. line-height: 36px;
  617. padding-right: 30px;
  618. -webkit-appearance: none;
  619. background-color: #fff;
  620. background-image: none;
  621. border-radius: 4px;
  622. border: 1px solid #dcdfe6;
  623. -webkit-box-sizing: border-box;
  624. box-sizing: border-box;
  625. color: #606266;
  626. display: inline-block;
  627. font-size: inherit;
  628. width: 400px;
  629. outline: 0;
  630. padding: 0 15px;
  631. cursor: pointer;
  632. -webkit-transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);
  633. transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);
  634. }
  635. .form {
  636. /deep/ .el-form-item {
  637. margin-bottom: 15px;
  638. }
  639. }
  640. /deep/ .el-dialog__body {
  641. padding:20px;
  642. color: #606266;
  643. font-size: 14px;
  644. word-break: break-all;
  645. }
  646. .itemClass .el-cascader-menu .el-cascader-menu__wrap li.el-cascader-node {
  647. height: auto;
  648. max-width: 500px;
  649. .el-cascader-node__label {
  650. // white-space: initial;
  651. overflow: initial;
  652. text-overflow: initial;
  653. }
  654. }
  655. /deep/ .el-dialog__body {
  656. padding: 20px;
  657. color: #606266;
  658. font-size: 14px;
  659. word-break: break-all;
  660. }
  661. /deep/ .el-input__count{
  662. right: 70px;
  663. bottom: -26px;
  664. }
  665. </style>