fixed_integral.vue 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236
  1. <template>
  2. <div>
  3. <el-row>
  4. <el-col :span="24">
  5. <el-alert
  6. class="diy-tip"
  7. title="什么是固定积分?"
  8. @close="tips_close"
  9. v-show="tips_show"
  10. type="success"
  11. description
  12. show-icon
  13. >
  14. <p>系统按照设定的时间(每月/每周/每日) 自动给员工添加的积分,比如某员工有一个工程师证,得到公司的认可,公司就会每月给他加分</p>
  15. </el-alert>
  16. </el-col>
  17. </el-row>
  18. <el-row class="fixed_integral_box">
  19. <el-col :span="6" class="rule_class">
  20. <el-row :gutter="40" style="margin:21px 0 36px;">
  21. <el-col :span="24">
  22. <div style="text-align: center; margin-bottom: 10px;">
  23. <el-button @click="add_grouping()" type="primary" style="padding:10px 64px;">添加分类</el-button>
  24. </div>
  25. <div style="text-align: center;">
  26. <el-button @click="add_rules_item" type="primary" style="padding:10px 64px;">添加规则</el-button>
  27. </div>
  28. </el-col>
  29. <el-col :span="24" style="padding-right: 0;" v-loading="rule_trees_load">
  30. <el-menu class="rule_name" :unique-opened="true">
  31. <el-submenu :index="index.toString()" v-for="(item,index) in rule_list" :key="index">
  32. <template slot="title">
  33. <i class="el-icon-edit-outline" @click.stop="edit_grouping(item)"></i>
  34. <span class="title_top"><pre style="font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;max-width: calc(100vh - 500px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">{{item.name}}</pre></span>
  35. <!-- <i class="el-icon-edit-outline" @click.stop="edit_grouping(item)">编辑</i> -->
  36. </template>
  37. <span
  38. :index="i.toString()"
  39. v-for="(d,i) in item_list"
  40. :key="i"
  41. v-show="d[0].rule_id == item.id"
  42. >
  43. <el-menu-item
  44. :index="i1.toString()"
  45. v-for="(data,i1) in d"
  46. :key="i1"
  47. @click="open_right(data)"
  48. ><span slot="title"><pre style="font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;max-width: calc(100vh - 500px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">{{data.remark}}</pre></span>
  49. </el-menu-item>
  50. </span>
  51. </el-submenu>
  52. </el-menu>
  53. </el-col>
  54. </el-row>
  55. </el-col>
  56. <el-col :span="18" class="rule_list" v-loading="table_loading">
  57. <el-row :gutter="60" style="margin:21px 0 36px;">
  58. <el-col
  59. :span="24"
  60. v-show="(rule_list.length == 0||item_list.length == 0)"
  61. style="text-align: center;margin: 0 auto;position: relative;top: 50%;margin-top: 120px;"
  62. >
  63. <p>
  64. <img src="/static/images/nodata_default.png" width="200px" alt />
  65. </p>
  66. <p style="color: #909399;">还没有分类和规则</p>
  67. <p style="color: #909399;">
  68. <span style="color: #26A2FF;" @click="add_grouping">【添加分类】</span>,再
  69. <span style="color: #26A2FF;" @click="add_rules_item">添加规则</span>
  70. </p>
  71. </el-col>
  72. <el-col v-if="item_list.length != 0">
  73. <el-row>
  74. <!-- <el-col :span="24" style="font-size:20px;color:#303133;line-height:36px;">
  75. <pre style="font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;display:flex">
  76. <el-popover trigger="hover" placement="top" popper-class="popperSPBOX" style="padding: 9px 0 0 10px;">
  77. <span style="white-space: pre-wrap">{{right_rules_detail.remark}}</span>
  78. <div slot="reference" class="name-wrapper" style=" max-width: calc(100vh - 500px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">
  79. <span style="white-space: pre">{{right_rules_detail.remark}}</span>
  80. </div>
  81. </el-popover>
  82. <el-popover trigger="hover" placement="top" popper-class="popperSPBOX" style="padding: 9px 0 0 10px;">
  83. <span>{{right_rules_detail.min_point}}</span>
  84. <div slot="reference" class="name-wrapper" style=" max-width: calc(100vh - 830px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">
  85. <span>{{right_rules_detail.min_point}}</span>
  86. </div>
  87. </el-popover>
  88. <span style="padding: 9px 0 0 0;">B分</span> -->
  89. <!-- <el-button plain style="padding:10px 12px; margin-left: 10px;" @click="edit_rules(right_rules_detail)">编辑</el-button></pre>
  90. </el-col> -->
  91. <el-col :span="24" style="white-space: pre-wrap;font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;display:flex;flex-wrap:wrap;font-size:20px;color:#303133;line-height:36px;">
  92. <div><span style="font-size:19px">{{right_rules_detail.remark}}</span></div>
  93. <div>
  94. <span style="padding: 9px 0 0 10px;">{{right_rules_detail.min_point}}B分</span>
  95. <el-button plain style="padding:10px 12px; margin-left: 10px;" @click="edit_rules(right_rules_detail)">编辑</el-button>
  96. </div>
  97. </el-col>
  98. </el-row>
  99. <el-row :gutter="0" style="margin-top:20px;">
  100. <el-col :span="4">
  101. <el-button plain type="danger" @click="many_del">批量删除</el-button>
  102. </el-col>
  103. <el-col :span="4">
  104. <el-button type="primary" @click="add_employee_show= true">添加人员</el-button>
  105. </el-col>
  106. <!-- <el-button
  107. type="primary"
  108. plain
  109. @click="import_rules_show = true"
  110. >导入自动积分</el-button> -->
  111. <el-col :span="7" style="padding-left:15px;float:right;position: relative;">
  112. <div v-if="dropOuOfPers.currentLabel && dropOuOfPers.currentLabel != ''" class="dropOuOfPersName" @click="takePartIn">
  113. <WWOpenData type="userName" :openid="dropOuOfPers.currentLabel"></WWOpenData>
  114. </div>
  115. <el-select v-model="select_employee_id" ref="dropOuOfref" clearable placeholder="请选择人员">
  116. <el-option
  117. v-for="item in employee_map"
  118. :key="item.id"
  119. :label="item.name"
  120. :value="item.id"
  121. >
  122. <span style="float: left"><WWOpenData type="userName" :openid="item.name"></WWOpenData></span>
  123. </el-option>
  124. </el-select>
  125. <!-- <el-input
  126. placeholder="输入关键词"
  127. ref="search-bar"
  128. v-model="integralKeywords"
  129. class="input-with-select"
  130. @keyup.enter.native="onFilterChanged"
  131. >
  132. <el-button slot="append" icon="el-icon-search" @click="onFilterChanged"></el-button>
  133. </el-input> -->
  134. </el-col>
  135. </el-row>
  136. <el-table
  137. ref="multipleTable"
  138. :data="table_list"
  139. v-loading="table_loading"
  140. tooltip-effect="dark"
  141. style="width: 100%;margin-top:20px;"
  142. @selection-change="handleSelectionChange"
  143. >
  144. <el-table-column type="selection" width="45"></el-table-column>
  145. <el-table-column label="姓名">
  146. <template slot-scope="scope">
  147. <span class="fl">
  148. <userImage
  149. :id="scope.row.employee_id"
  150. :img_url="scope.row.img_url"
  151. width="50px"
  152. height="50px"
  153. :user_name="scope.row.name"
  154. v-if="scope.row"
  155. ></userImage>
  156. </span>
  157. <span
  158. style="margin-left: 10px; line-height: 50px; display: inline-block"
  159. v-if="scope.row.name"
  160. >
  161. <WWOpenData type="userName" :openid="scope.row.name"></WWOpenData>
  162. </span>
  163. </template>
  164. </el-table-column>
  165. <el-table-column prop="cycle_remark" label="加分周期"></el-table-column>
  166. <template slot="empty">
  167. <div class="nopoint_box">
  168. <div class="noimg noperson"></div>
  169. <span class="title">没有对应的数据</span>
  170. </div>
  171. </template>
  172. </el-table>
  173. <div style=" text-align: center; padding: 20px;">
  174. <el-pagination
  175. background
  176. layout="total, prev, pager, next"
  177. :current-page="page"
  178. @current-change="handleCurrentChange"
  179. :page-size.sync="pagesize"
  180. :page-sizes="[10, 20, 50, 100]"
  181. :total="total"
  182. ></el-pagination>
  183. </div>
  184. </el-col>
  185. </el-row>
  186. </el-col>
  187. </el-row>
  188. <el-dialog
  189. :title="grouping_type == 'add'?'新增分类':'编辑分类'"
  190. :visible.sync="grouping_show"
  191. :close-on-click-modal="false"
  192. width="500px"
  193. >
  194. <el-form :model="grouping" ref="grouping" :rules="grouping_rules" label-width="100px">
  195. <el-form-item label="分类名称" prop="name">
  196. <el-input v-model="grouping.name" placeholder="请输入分类名称"></el-input>
  197. </el-form-item>
  198. <div style="overflow: hidden;">
  199. <el-button
  200. class="fl"
  201. :disabled="btn_disabled"
  202. type="danger"
  203. v-show="grouping_type == 'edit'"
  204. @click="del_grouping(grouping)"
  205. >删除</el-button>
  206. <el-button
  207. class="fr"
  208. :disabled="btn_disabled"
  209. type="primary"
  210. @click="grouping_btn('grouping')"
  211. >确定</el-button>
  212. <el-button class="fr" :disabled="btn_disabled" @click="grouping_close('grouping')">取消</el-button>
  213. </div>
  214. </el-form>
  215. </el-dialog>
  216. <el-dialog
  217. :title="rules_detail_title"
  218. :visible.sync="rules_detail_show"
  219. width="532px"
  220. :close-on-click-modal="false"
  221. @close="rules_detail_close('rules_detail_form')"
  222. >
  223. <el-form
  224. :model="rules_detail_form"
  225. ref="rules_detail_form"
  226. :rules="rules_rules"
  227. label-width="120px"
  228. >
  229. <el-form-item label="规则名称" prop="remark">
  230. <el-input v-model="rules_detail_form.remark" placeholder="请输入规则名称"></el-input>
  231. </el-form-item>
  232. <el-form-item label="分类" prop="rule_id">
  233. <el-select v-model="rules_detail_form.rule_id" style="width: 100%;" placeholder="请选择分类">
  234. <el-option
  235. v-for="item in rule_list"
  236. :key="item.value"
  237. :label="item.name"
  238. :value="item.id"
  239. ></el-option>
  240. </el-select>
  241. </el-form-item>
  242. <el-form-item label="积分" prop="min_point">
  243. <el-input v-model="rules_detail_form.min_point" placeholder="请输入积分"></el-input>
  244. <span
  245. data-v-a17f1960
  246. style="display: block; font-size: 12px; color: rgb(96, 98, 102);text-align: left;"
  247. >固定加分加B分</span>
  248. </el-form-item>
  249. <!-- <el-form-item label="是否与考勤挂钩" prop="is_attendance">
  250. <el-switch v-model="rules_detail_form.is_attendance"></el-switch>
  251. </el-form-item> -->
  252. <div style="overflow: hidden;">
  253. <el-button
  254. type="danger"
  255. :disabled="btn_disabled"
  256. v-show="rules_detail_title == '编辑规则'"
  257. class="fl"
  258. @click="del_rules_detail(rules_detail_form)"
  259. >删除</el-button>
  260. <el-button
  261. class="fr"
  262. :disabled="btn_disabled"
  263. type="primary"
  264. @click="editRule('rules_detail_form')"
  265. v-if="rules_detail_title == '编辑规则'"
  266. >确定</el-button>
  267. <el-button
  268. class="fr"
  269. :disabled="btn_disabled"
  270. type="primary"
  271. @click="addRule('rules_detail_form')"
  272. v-else
  273. >确定</el-button>
  274. <el-button
  275. class="fr"
  276. :disabled="btn_disabled"
  277. @click="rules_detail_close('rules_detail_form')"
  278. >取消</el-button>
  279. </div>
  280. </el-form>
  281. </el-dialog>
  282. <el-dialog
  283. title="添加人员"
  284. :visible.sync="add_employee_show"
  285. :before-close="add_employee_close"
  286. width="700px"
  287. >
  288. <el-form :model="add_employee_form" ref="add_employee_form" label-width="80px">
  289. <el-form-item
  290. label="加分周期"
  291. :rules="[{ required: true, message: '请选择加分周期', trigger: 'change' }]"
  292. >
  293. <el-select v-model="task_cycle_name" placeholder="请选择加分周期">
  294. <el-option
  295. v-for="item in task_cycle"
  296. :key="item.value"
  297. :label="item.name"
  298. :value="item.value"
  299. ></el-option>
  300. </el-select>
  301. </el-form-item>
  302. <span style="color:#ff0000;padding-left:12px;">
  303. 注:非在职状态的员工,系统不会执行自动积分
  304. </span>
  305. <div>
  306. <!-- <EmployeeSelector1
  307. :max="add_employee_max"
  308. :can_select_dept="false"
  309. :visible.sync="add_employee_visible"
  310. @confirm="add_employee_confirm"
  311. ref="Employee"
  312. ></EmployeeSelector1> -->
  313. <EmployeeSelector1
  314. :max="add_employee_max"
  315. :is_filtration_creator="true"
  316. :visible.sync="add_employee_visible"
  317. @confirm="add_employee_confirm"
  318. ref="Employee"
  319. ></EmployeeSelector1>
  320. </div>
  321. <el-form-item style="text-align: right; margin-bottom: 0;margin-top: 20px;">
  322. <el-button :disabled="btn_disabled" @click="add_employee_close()">取消</el-button>
  323. <el-button
  324. :disabled="btn_disabled"
  325. type="primary"
  326. @click="sub_add_employee('add_employee_form')"
  327. >完成</el-button>
  328. </el-form-item>
  329. </el-form>
  330. </el-dialog>
  331. <!-- 导入规则 -->
  332. <el-dialog
  333. title="导入自动积分"
  334. :visible.sync="import_rules_show"
  335. width="500px"
  336. @before-close="close_import">
  337. <el-row>
  338. <el-col :span="12">
  339. <div class="text-center">
  340. <p>1、导出模板,填写好规则</p>
  341. <p>
  342. <img src="/static/images/rules_mould.png" alt="">
  343. </p>
  344. <p>规则表</p>
  345. <p><a target="_blank" :href="publicBASE_API+'/api/download/point_auto'" ><el-button type="primary">下载模板</el-button></a></p>
  346. </div>
  347. </el-col>
  348. <el-col :span="12">
  349. <div class="text-center">
  350. <p>2、上传填好的规则表</p>
  351. <p>
  352. <img src="/static/images/rules_mould1.png" alt="">
  353. </p>
  354. <p>仅支持xls、xlsx格式文件</p>
  355. <el-upload
  356. class="upload-demo"
  357. :headers="ATOKEN"
  358. :data="{type:'auto_integral'}"
  359. ref="upload"
  360. :limit = '1'
  361. :action="integralUpload"
  362. :on-preview="handlePreview"
  363. :on-remove="handleRemove"
  364. :on-success="handleSuccess"
  365. :before-upload="beforeFilesUpload"
  366. :file-list="fileList">
  367. <el-button slot="trigger" type="primary">选取文件</el-button>
  368. </el-upload>
  369. <p><el-button type="primary" @click="submitUpload" :loading="save_loading" v-show="import_btn_show" block>导入</el-button></p>
  370. </div>
  371. </el-col>
  372. </el-row>
  373. </el-dialog>
  374. </div>
  375. </template>
  376. <script>
  377. import EmployeeSelector1 from "@/views/common/EmployeeSelector1";
  378. import { getToken } from '@/utils/auth'
  379. import { type } from "os";
  380. let PerformTheNumber = true;//五秒执行一次变量
  381. export default {
  382. data() {
  383. const isInteger = (rule, value, callback) => {
  384. if (!value) {
  385. return callback(new Error("积分不可以为空"));
  386. }
  387. setTimeout(() => {
  388. if (!Number(value)) {
  389. callback(new Error("积分必须是正整数"));
  390. } else {
  391. const re = /^[0-9]*[1-9][0-9]*$/;
  392. const rsCheck = re.test(value);
  393. if (!rsCheck) {
  394. callback(new Error("积分必须是正整数"));
  395. } else {
  396. callback();
  397. }
  398. }
  399. }, 0);
  400. };
  401. return {
  402. integralUpload:process.env.BASE_API + '/api/upload/excel',
  403. publicBASE_API:process.env.BASE_API,
  404. save_loading: false,
  405. ATOKEN: { 'A-TOKEN': getToken()},
  406. import_btn_show: false,
  407. fileList: [],
  408. file: null,
  409. import_rules_show:false,//导出弹窗
  410. handleCurrent:'',
  411. resultsItemId: "",
  412. btn_disabled: false,
  413. one_left_item: {},
  414. select_employee_id: "",
  415. employee_map: JSON.parse(localStorage.getItem("SET_EMPLOYEE_MAP")),
  416. table_loading: false,
  417. rules_detail_title: "新增规则",
  418. right_rules_detail: {},
  419. add_rulse_id: "",
  420. add_employee_id: "",
  421. add_employee_visible: false,
  422. add_employee_max: 0,
  423. rule_trees_load: false,
  424. rule_list_load: false,
  425. employee_list: [],
  426. active: 1,
  427. add_employee_show: false,
  428. grouping_show: false,
  429. grouping_type: "add",
  430. rules_detail_show: false,
  431. add_point: false,
  432. edit_point: false,
  433. defaultProps: {
  434. children: "child",
  435. label: "name",
  436. },
  437. grouping: {
  438. name: "",
  439. },
  440. grouping_rules: {
  441. name: [
  442. {
  443. required: true,
  444. message: "请输入分类名称",
  445. trigger: "blur",
  446. },
  447. {
  448. max: 25,
  449. message: "规则名称不能大于25个字",
  450. trigger: "blur",
  451. },
  452. ],
  453. },
  454. rule_list: [], //分类集合
  455. item_list: [], //规则集合
  456. rules_detail_form: {
  457. rule_id: "",
  458. range_type: "1",
  459. prize_type: "0",
  460. min_point: "",
  461. remark: "",
  462. is_attendance: "0",
  463. cycle_type: "2",
  464. pt_id: "3",
  465. },
  466. rules_rules: {
  467. remark: [
  468. {
  469. required: true,
  470. message: "请输入规则名称",
  471. trigger: "blur",
  472. },
  473. {
  474. max: 50,
  475. message: "分类名称不能大于50个字",
  476. trigger: "blur",
  477. },
  478. ],
  479. min_point: [
  480. {
  481. required: true,
  482. message: "请输入积分",
  483. trigger: "blur",
  484. },
  485. {
  486. validator: isInteger,
  487. trigger: "blur",
  488. },
  489. ],
  490. rule_id: [
  491. {
  492. required: true,
  493. message: "请选择分类",
  494. trigger: "blur",
  495. },
  496. ],
  497. },
  498. task_cycle: [
  499. {
  500. name: "每天自动加分",
  501. value: 1,
  502. },
  503. {
  504. name: "每周自动加分",
  505. value: 2,
  506. },
  507. {
  508. name: "每月自动加分",
  509. value: 3,
  510. },
  511. ],
  512. task_cycle_name: '',
  513. add_employee_form: {
  514. employee_ids: [],
  515. },
  516. table_list: [],
  517. // selected:{employee:[], dept: []},//选择员工数据
  518. del_arr: {
  519. ids: [],
  520. },
  521. employee_id: "", //选择人员的ID
  522. integralKeywords: "",
  523. showIndex: "0",
  524. tips_show: false,
  525. total: 0, //返回的总数据
  526. page: 1, //默认页数 为1
  527. pagesize: 10, //每页显示的数据
  528. dropOuOfPers:[],
  529. };
  530. },
  531. components: {
  532. EmployeeSelector1,
  533. },
  534. watch: {
  535. select_employee_id(val) {
  536. this.employee_id = val;
  537. this.open_right(this.employee_id);
  538. this.$nextTick(()=>{
  539. console.log(this.$refs['dropOuOfref'].selected)
  540. this.dropOuOfPers = this.$refs['dropOuOfref'].selected
  541. })
  542. },
  543. },
  544. methods: {
  545. takePartIn(){
  546. this.$refs['dropOuOfref'].visible = true
  547. },
  548. //搜索
  549. onFilterChanged(){
  550. this.open_right()
  551. },
  552. close_import(){
  553. this.import_rules_show = false
  554. this.import_btn_show = false
  555. this.$refs.upload.clearFiles()
  556. },
  557. submitUpload() {
  558. this.save_loading = true
  559. let params = {
  560. file: this.file
  561. }
  562. this.$http('post','/api/integral/auto/import', params).then(res => {
  563. if(res.data.code == 1) {
  564. // this.import_rules_show = false;
  565. this.close_import()//成功之后关闭并清除选中的文件
  566. this.$message.success({message:res.data.msg})
  567. this.get_rule_trees();
  568. // if(res.data.data.list.length != 0){
  569. // this.error_list_show = true
  570. // this.error_list.push(res.data.data)
  571. // }else{
  572. // this.$message.success({message:res.data.msg})
  573. // }
  574. // if(res.data.data.length != 0 && res.data.data.length != undefined){
  575. // this.error_list_show = true
  576. // this.error_list = res.data.data
  577. // }else{
  578. // this.get_department_list()
  579. // }
  580. }else{
  581. this.$message({type:'error',message:res.data.msg})
  582. }
  583. }).catch(()=>{
  584. }).finally(()=>{
  585. this.save_loading = false
  586. })
  587. },
  588. //导入
  589. beforeFilesUpload(file) {
  590. const $ext_list = ['xlsx', 'xls'];
  591. let len = file.name.split('.').length - 1;
  592. const $ext_name = file.name.split('.')[len]
  593. if ($ext_list.indexOf($ext_name) != -1) {
  594. this.import_btn_show = true
  595. }else {
  596. this.$message.warning('文件格式上传错误,仅支持上传xlsx,xls)')
  597. return false
  598. }
  599. },
  600. handleSuccess(response) {
  601. if(response.code == 1) {
  602. this.file = response.data;
  603. }
  604. },
  605. handleRemove(file, fileList) {
  606. if (fileList !== null && fileList.length != 0) {
  607. this.import_btn_show = true
  608. }else{
  609. this.import_btn_show = false
  610. }
  611. },
  612. handlePreview(file) {
  613. console.log(file);
  614. },
  615. handleCurrentChange(val) {
  616. this.page = val;
  617. this.open_right(this.handleCurrent);
  618. },
  619. tips_close() {
  620. localStorage.setItem("fixed_integral_tips", "true");
  621. this.tips_show = false;
  622. },
  623. add_employee_close() {
  624. this.task_cycle_name = "";
  625. this.add_employee_show = false;
  626. },
  627. add_employee_confirm(val) {
  628. this.add_employee_form.employee_ids = [];
  629. if (val.employee.length !== 0) {
  630. val.employee.forEach((element) => {
  631. this.add_employee_form.employee_ids.push(element.id);
  632. });
  633. }
  634. },
  635. // 添加人员 提交数据
  636. sub_add_employee(form) {
  637. let self = this;
  638. if (!self.task_cycle_name) {
  639. if(PerformTheNumber){
  640. self.$message.error("请选择加分周期");
  641. PerformTheNumber = false;
  642. setTimeout(()=>{
  643. PerformTheNumber = true
  644. },5000)
  645. }
  646. return false;
  647. }
  648. this.$refs.Employee.confirm(); //调用组件的confirm();
  649. if (this.add_employee_form.employee_ids.length <= 0) {
  650. if(PerformTheNumber){
  651. this.$message.error("请选择员工");
  652. PerformTheNumber = false;
  653. setTimeout(()=>{
  654. PerformTheNumber = true
  655. },5000)
  656. }
  657. return false;
  658. }
  659. let data = {
  660. employee_ids: this.add_employee_form.employee_ids,
  661. task_cycle: self.task_cycle_name,
  662. item_id: self.add_employee_id,
  663. rule_id: self.add_rulse_id,
  664. };
  665. self.$refs[form].validate((valid) => {
  666. if (valid) {
  667. if (data.rule_id == "" || data.item_id == "") {
  668. if(PerformTheNumber){
  669. self.$message.error("请先选择细则");
  670. PerformTheNumber = false;
  671. setTimeout(()=>{
  672. PerformTheNumber = true
  673. },5000)
  674. }
  675. } else {
  676. self.$http("post","/api/integral/auto/add",data,)
  677. .then((res) => {
  678. if (res.data.code == 1) {
  679. self.add_employee_show = false;
  680. self.$message.success(
  681. "此次操作成功" +
  682. res.data.data.success +
  683. "条,失败" +
  684. res.data.data.error +
  685. "条,已经存在的" +
  686. res.data.data.exist +
  687. "条"
  688. );
  689. // self.open_right();
  690. self.get_rule_trees();
  691. } else {
  692. self.$message.error(res.data.msg);
  693. }
  694. })
  695. .catch((e) => {
  696. self.$message.error(e.data.msg);
  697. })
  698. .finally(() => {
  699. self.loading = false;
  700. });
  701. }
  702. } else {
  703. return false;
  704. }
  705. });
  706. },
  707. handleNodeClick(data) {
  708. },
  709. handleSelectionChange(val) {
  710. this.del_arr.ids = [];
  711. val.forEach((element) => {
  712. this.del_arr.ids.push(element.id);
  713. });
  714. },
  715. // 新增规则
  716. addRule(form) {
  717. let self = this;
  718. self.$refs[form].validate((valid) => {
  719. if (valid) {
  720. self.btn_disabled = true;
  721. let data = null;
  722. self.rules_detail_form.max_point = self.rules_detail_form.min_point;
  723. self.rules_detail_form.is_attendance
  724. ? (self.rules_detail_form.is_attendance = 1)
  725. : (self.rules_detail_form.is_attendance = 0);
  726. data = { items: [self.rules_detail_form] };
  727. self
  728. .$http("post","/api/integral/rule/items",data,)
  729. .then((res) => {
  730. if (res.data.code == 1) {
  731. self.add_employee_show = true;
  732. self.add_employee_id = res.data.data.item_id;
  733. self.$message.success(res.data.msg);
  734. self.add_rulse_id = self.rules_detail_form.rule_id;
  735. } else {
  736. self.$message.error(res.data.msg);
  737. }
  738. self.btn_disabled = false;
  739. })
  740. .catch((e) => {
  741. self.$message.error(e.data.msg);
  742. self.btn_disabled = false;
  743. })
  744. .finally(() => {
  745. self.loading = false;
  746. self.rules_detail_show = false;
  747. });
  748. } else {
  749. return false;
  750. }
  751. });
  752. },
  753. // 编辑规则
  754. editRule(form) {
  755. let self = this;
  756. // self.table_loading = true
  757. self.$refs[form].validate((valid) => {
  758. if (valid) {
  759. self.btn_disabled = true;
  760. let data = null;
  761. self.rules_detail_form.max_point = self.rules_detail_form.min_point;
  762. self.rules_detail_form.is_attendance
  763. ? (self.rules_detail_form.is_attendance = 1)
  764. : (self.rules_detail_form.is_attendance = 0);
  765. self.rules_detail_form.item_id = self.rules_detail_form.id;
  766. data = self.rules_detail_form;
  767. // self.right_rules_detail = data
  768. self
  769. .$http("PUT","/api/integral/rule/items",data,)
  770. .then((res) => {
  771. if (res.data.code == 1) {
  772. self.get_rule_trees();
  773. this.rules_detail_show = false; //成功消失
  774. self.add_rulse_id = self.rules_detail_form.rule_id;
  775. self.$message.success(res.data.msg);
  776. self.add_employee_show = false;
  777. self.btn_disabled = false;
  778. } else {
  779. self.$message.error(res.data.msg);
  780. self.btn_disabled = false;
  781. }
  782. })
  783. .catch((e) => {
  784. self.$message.error(e.data.msg);
  785. self.btn_disabled = false;
  786. })
  787. .finally(() => {
  788. self.loading = false;
  789. });
  790. } else {
  791. return false;
  792. }
  793. });
  794. },
  795. rules_detail_close(form) {
  796. this.rules_detail_show = false;
  797. this.$refs[form].resetFields();
  798. },
  799. del_rules_detail(item) {
  800. this.$confirm("此操作将永久删除该规则, 是否继续?", "提示", {
  801. confirmButtonText: "确定",
  802. cancelButtonText: "取消",
  803. type: "warning",
  804. }).then(() => {
  805. this.$http("DELETE","/api/integral/rule/items",{item_id: item.id,},)
  806. .then((res) => {
  807. if (res.data.code == 1) {
  808. this.get_rule_trees();
  809. this.$message.success(res.data.msg);
  810. this.rules_detail_show = false;
  811. } else {
  812. this.$message.error(res.data.msg);
  813. }
  814. })
  815. .catch((e) => {
  816. this.$message.error(e.data.msg);
  817. })
  818. .finally(() => {
  819. this.loading = false;
  820. });
  821. });
  822. },
  823. //添加与编辑分组
  824. grouping_btn(form) {
  825. let self = this;
  826. self.$refs[form].validate((valid) => {
  827. if (valid) {
  828. let type = self.grouping_type;
  829. let data =
  830. type == "add"
  831. ? {
  832. cycle_type: "2",
  833. pid: "0",
  834. name: self.grouping.name,
  835. }
  836. : {
  837. rule_id: self.grouping.id,
  838. pid: "0",
  839. name: self.grouping.name,
  840. };
  841. self.btn_disabled = true;
  842. self
  843. .$http(type == "add" ? "post" : "PUT","/api/integral/rule",data,)
  844. .then((res) => {
  845. if (res.data.code == 1) {
  846. self.$message.success(res.data.msg);
  847. self.get_rule_trees();
  848. self.grouping_close();
  849. } else {
  850. self.$message.error(res.data.msg);
  851. }
  852. self.btn_disabled = false;
  853. })
  854. .catch((e) => {
  855. self.$message.error(e.data.msg);
  856. self.btn_disabled = false;
  857. })
  858. .finally(() => {
  859. self.loading = false;
  860. self.btn_disabled = false;
  861. });
  862. } else {
  863. return false;
  864. }
  865. });
  866. },
  867. add_grouping() {
  868. this.grouping.name = ''
  869. this.grouping_show = true;
  870. this.grouping_type = "add";
  871. },
  872. edit_grouping(item) {
  873. this.grouping_show = true;
  874. this.grouping = JSON.parse(JSON.stringify(item));
  875. this.grouping_type = "edit";
  876. },
  877. grouping_close(form) {
  878. this.grouping_show = false;
  879. if (form) {
  880. this.$refs[form].resetFields();
  881. }
  882. },
  883. del_grouping(item) {
  884. this.$confirm("此操作将永久删除该分类, 是否继续?", "提示", {
  885. confirmButtonText: "确定",
  886. cancelButtonText: "取消",
  887. type: "warning",
  888. }).then(() => {
  889. this.btn_disabled = true;
  890. this.$http("DELETE","/api/integral/rule",{rule_id: item.id,},)
  891. .then((res) => {
  892. if (res.data.code == 1) {
  893. this.$message.success(res.data.msg);
  894. this.grouping_show = false;
  895. this.get_rule_trees();
  896. } else {
  897. this.$message.error(res.data.msg);
  898. }
  899. this.btn_disabled = false;
  900. })
  901. .catch((e) => {
  902. this.btn_disabled = false;
  903. this.$message.error(e.data.msg);
  904. })
  905. .finally(() => {
  906. this.loading = false;
  907. });
  908. });
  909. },
  910. // 获取规则分类 与 规则细则
  911. get_rule_trees() {
  912. let self = this;
  913. self.rule_trees_load = true;
  914. self.$http('get',"/api/integral/rule/trees",{cycle_type: "2",},)
  915. .then((res) => {
  916. if (res.data.code == 1) {
  917. self.rule_list = res.data.data.rule_tree;
  918. self.item_list = res.data.data.item_list;
  919. if (self.item_list !== null) {
  920. for (const key in self.item_list) {
  921. for (let i = 0; i < self.item_list[key].length; i++) {
  922. if (i == 0) {
  923. self.open_right(self.item_list[key][i]);
  924. return false;
  925. }
  926. }
  927. }
  928. }
  929. } else {
  930. self.$message.error(res.data.msg);
  931. }
  932. self.rule_trees_load = false;
  933. })
  934. .finally(() => {
  935. self.rule_trees_load = false;
  936. });
  937. },
  938. //自动积分规则列表
  939. open_right(data) {
  940. // console.log(data)
  941. if(this.handleCurrent!=data){
  942. this.page = 1
  943. }
  944. this.handleCurrent=data
  945. let self = this;
  946. self.rule_list_load = true;
  947. self.table_loading = true;
  948. // var params = {params:{}}
  949. // if(data){
  950. // params.params.item_id = data.id || ''
  951. // params.params.employee_id = data.employee_id || ''
  952. // params.params.page = self.page
  953. // self.rule_id = data.rule_id
  954. // self.item_id = data.id
  955. // }
  956. if (data&&data.id) {
  957. self.add_employee_id = data.id;
  958. self.add_rulse_id = data.rule_id;
  959. self.right_rules_detail = data;
  960. }
  961. var params = {
  962. item_id: self.add_employee_id,
  963. employee_id: self.employee_id || "",
  964. remark:self.integralKeywords,
  965. page: self.page,
  966. page_size: Number(this.pagesize),
  967. };
  968. self.$http('get',"/api/integral/auto/list", params).then((res) => {
  969. if (res.data.code == 1) {
  970. if (data&&data.id) {
  971. self.right_rules_detail = data;
  972. }
  973. self.table_list = res.data.data.list || [];
  974. self.total = res.data.data.total;
  975. } else {
  976. self.$message.error(res.data.msg);
  977. }
  978. })
  979. .finally(() => {
  980. self.rule_list_load = false;
  981. self.table_loading = false;
  982. });
  983. },
  984. many_del() {
  985. let self = this;
  986. if (self.del_arr.ids.length !== 0) {
  987. self
  988. .$confirm("此操作将永久删除该人员的自动加分, 是否继续?", "提示", {
  989. confirmButtonText: "确定",
  990. cancelButtonText: "取消",
  991. type: "warning",
  992. })
  993. .then(() => {
  994. self
  995. .$http("post","/api/integral/auto/delete/many",self.del_arr,)
  996. .then((res) => {
  997. if (res.data.code == 1) {
  998. self.$message.success(res.data.msg);
  999. // self.open_right();
  1000. this.get_rule_trees();
  1001. } else {
  1002. self.$message.error(res.data.msg);
  1003. }
  1004. })
  1005. .catch((e) => {
  1006. self.$message.error(e.data.msg);
  1007. })
  1008. .finally(() => {
  1009. self.loading = false;
  1010. });
  1011. })
  1012. .catch(() => {});
  1013. } else {
  1014. self.$message.error("请选择要移除的人员");
  1015. }
  1016. },
  1017. edit_rules(data) {
  1018. this.rules_detail_show = true;
  1019. this.rules_detail_title = "编辑规则";
  1020. this.rules_detail_form = JSON.parse(
  1021. JSON.stringify(this.right_rules_detail)
  1022. );
  1023. this.rules_detail_form.sync = "2";
  1024. if (this.rules_detail_form.is_attendance) {
  1025. this.rules_detail_form.is_attendance = true;
  1026. } else {
  1027. this.rules_detail_form.is_attendance = false;
  1028. }
  1029. },
  1030. // 新增规则
  1031. add_rules_item() {
  1032. this.rules_detail_title = "新增规则";
  1033. this.rules_detail_show = true;
  1034. },
  1035. // 编辑规则
  1036. edit_rules_item() {},
  1037. },
  1038. mounted() {
  1039. this.get_rule_trees();
  1040. if (localStorage.getItem("fixed_integral_tips")) {
  1041. this.tips_show = false;
  1042. } else {
  1043. this.tips_show = true;
  1044. }
  1045. },
  1046. };
  1047. </script>
  1048. <style lang="scss" scoped>
  1049. .el-submenu .el-icon-edit-outline {
  1050. color: #999 !important;
  1051. }
  1052. .is-opened .el-icon-edit-outline {
  1053. color: #409eff !important;
  1054. }
  1055. .title_top {
  1056. overflow: hidden;
  1057. white-space: nowrap;
  1058. text-overflow: ellipsis;
  1059. width: 130px !important;
  1060. display: inline-block;
  1061. }
  1062. .fixed_integral_box {
  1063. display: flex;
  1064. width: 100%;
  1065. margin-bottom: 20px;
  1066. background: #fff;
  1067. min-height: calc(100vh - 160px);
  1068. .rule_class {
  1069. position: relative;
  1070. display: table-cell;
  1071. border-right: none;
  1072. .rule_name {
  1073. border-right: 0;
  1074. margin-top: 16px;
  1075. li {
  1076. margin-right: 20px !important;
  1077. border-bottom: 1px #f8f8f8 solid;
  1078. overflow: hidden;
  1079. white-space: nowrap;
  1080. text-overflow: ellipsis;
  1081. /deep/ .el-submenu__title {
  1082. padding: 0 10px !important;
  1083. i.el-submenu__icon-arrow.el-icon-arrow-down {
  1084. color: #909399 !important;
  1085. }
  1086. }
  1087. li:hover .el-submenu__title {
  1088. background: #e7f6ff;
  1089. }
  1090. ul {
  1091. li.is-active {
  1092. background-color: #e7f6ff !important;
  1093. }
  1094. }
  1095. }
  1096. /deep/ .is-opened .el-submenu__title .title_top {
  1097. color: #409eff !important;
  1098. }
  1099. /deep/ .is-opened .el-menu .el-menu-item span {
  1100. color: #333;
  1101. }
  1102. /deep/ .is-opened .el-menu .is-active span {
  1103. color: #409eff;
  1104. }
  1105. }
  1106. }
  1107. .rule_list {
  1108. position: relative;
  1109. display: table-cell;
  1110. }
  1111. .rule_list:after {
  1112. content: " ";
  1113. position: absolute;
  1114. top: 0;
  1115. left: 0;
  1116. bottom: 0;
  1117. width: 1px;
  1118. background: #ebeef5;
  1119. }
  1120. .rule_search /deep/ .el-input__suffix i {
  1121. width: 58px;
  1122. color: #909399;
  1123. margin-right: -5px;
  1124. background: #dcdfe6;
  1125. border-radius: 0 4px 4px 0;
  1126. }
  1127. /deep/ .alert_class_box {
  1128. position: relative;
  1129. display: block;
  1130. text-align: center;
  1131. }
  1132. /deep/ .el-transfer-panel {
  1133. display: inline-block;
  1134. text-align: left;
  1135. }
  1136. /deep/ .employee_selector_box {
  1137. padding: 0;
  1138. width: 100%;
  1139. }
  1140. }
  1141. .edit_btn_class {
  1142. position: absolute;
  1143. right: 10px;
  1144. padding: 2px;
  1145. top: 16px;
  1146. z-index: 1;
  1147. display: none;
  1148. }
  1149. span {
  1150. line-height: 18px;
  1151. }
  1152. .el-submenu__title:hover {
  1153. .edit_btn_class {
  1154. display: inline-block;
  1155. color: #fff;
  1156. background: #ffa200;
  1157. }
  1158. }
  1159. /deep/.selector_employee {
  1160. .el-form-item__content {
  1161. margin-left: 0 !important;
  1162. }
  1163. }
  1164. .diy-tip {
  1165. margin-bottom: 15px;
  1166. border: 1px solid #67c23a;
  1167. padding: 20px 16px;
  1168. p {
  1169. color: #67c23a !important;
  1170. font-size: 14px;
  1171. margin: 0 !important;
  1172. padding: 4px 0;
  1173. }
  1174. }
  1175. .popperSPBOX{
  1176. max-width: calc(100vh - 300px);
  1177. background-color: rgb(255, 255, 255);
  1178. }
  1179. .dropOuOfPersName {
  1180. position: absolute;
  1181. top: 0;
  1182. right: 0;
  1183. left: 0;
  1184. bottom: 0;
  1185. z-index: 9;
  1186. margin: 1px 0 0 16px;
  1187. padding-left: 14px;
  1188. background-color: #ffffff;
  1189. color: #1d1d1d;
  1190. width: 156px;
  1191. overflow: hidden;
  1192. cursor: pointer;
  1193. height:34px;
  1194. line-height:34px;
  1195. border-radius: 5px;
  1196. }
  1197. </style>