index.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673
  1. <template>
  2. <div>
  3. <div class="d-flex flex-between">
  4. <div>
  5. <el-button type="primary" size="medium" @click="addData">
  6. <!-- <span class="d-in-block v-mid el-icon-plus font-size-16"></span> -->
  7. <span class="d-in-block v-mid font-size-16">新建流程</span>
  8. </el-button>
  9. </div>
  10. <el-form label-width="100px" :inline="true">
  11. <el-form-item prop="state_value">
  12. <el-select class="mr10" v-model="type_value" placeholder="请选择类别">
  13. <el-option v-for="item in type_list" :key="item.value" :label="item.label" :value="item.value"></el-option>
  14. </el-select>
  15. </el-form-item>
  16. <el-form-item prop="keyword">
  17. <el-input placeholder="请输入搜索关键字" v-model="keyword" clearable @clear="getListData"></el-input>
  18. </el-form-item>
  19. <el-button type="primary" class="ml5" @click="getListData">搜索</el-button>
  20. </el-form>
  21. </div>
  22. <el-table :data="tableData" tooltip-effect="dark" v-loading="loading" style="width: 100%">
  23. <el-table-column type="selection" align="center" width="55"></el-table-column>
  24. <el-table-column label="序号" align="center" type="index" width="50"></el-table-column>
  25. <el-table-column label="流程名称" show-overflow-tooltip prop="lc_name"></el-table-column>
  26. <el-table-column label="创建人" prop="lc_qcgw"></el-table-column>
  27. <el-table-column label="创建时间" prop="create_dateline"></el-table-column>
  28. <el-table-column label="应用对象">
  29. <template slot-scope="scope">
  30. <div>
  31. {{ scope.row.lc_yydx_name == "" ? '全部门' : scope.row.lc_yydx_name }}
  32. </div>
  33. </template>
  34. </el-table-column>
  35. <el-table-column label="是否启用">
  36. <template slot-scope="scope">
  37. <el-switch v-model="scope.row.lc_status_option_k == '1' ? true : false"
  38. @change='changeStatus($event, scope.row)'></el-switch>
  39. </template>
  40. </el-table-column>
  41. <el-table-column label="操作" width="200">
  42. <template slot-scope="scope">
  43. <el-button type="text" @click="editData(scope.row)">编辑 </el-button>
  44. <el-button type="text" @click="detailData(scope.row)">详情</el-button>
  45. <el-button type="text" @click="delData(scope.row)">删除</el-button>
  46. </template>
  47. </el-table-column>
  48. </el-table>
  49. <footer class="flex-item-none" style="display: flex; justify-content: flex-end; margin-top: 30px">
  50. <el-pagination background layout="total,prev, pager, next" :page-size="limit" :total="total"
  51. :current-page.sync="cur_page" @current-change="handleCurrentChange"></el-pagination>
  52. </footer>
  53. <!-- dialogt弹出--新建和编辑 -->
  54. <el-dialog :title="title" :visible.sync="dialogFormVisible" width="60%;" v-loading="dialog_loading">
  55. <el-form :model="dialogForm" ref="addForm" :rules="check_rules" label-width="100px" label-position="left">
  56. <el-form-item label="流程名称" prop="lcmc">
  57. <el-input v-model="dialogForm.lcmc"></el-input>
  58. </el-form-item>
  59. <template>
  60. <div class="approvalDesign" style="margin-bottom:22px;">
  61. <h4 class="titleBi">审批流程设计</h4>
  62. <div class="singleItem" v-for="(item, index) in addAll" :key="index">
  63. <h4>审批部门</h4>
  64. <div class="formItem">
  65. <el-select v-model="item.detpart_all" placeholder="请选择审批部门" filterable @change="changeDepLinkNumber">
  66. <el-option v-for="secitem in orgLIST" :key="secitem.value" :label="secitem.label" :value="secitem">
  67. </el-option>
  68. </el-select>
  69. </div>
  70. <h4>审批人</h4>
  71. <div class="formItem">
  72. <el-select v-model="item.checker_all" placeholder="请选择审批人" filterable>
  73. <el-option v-for="thrItem in relUserList" :key="thrItem.value" :label="thrItem.label" :value="thrItem">
  74. </el-option>
  75. </el-select>
  76. </div>
  77. <h4>职位</h4>
  78. <div class="formItem">
  79. <el-input v-model="item.posts_name" placeholder="请输入职位"></el-input>
  80. </div>
  81. <div class="delIcon" @click="singleDel(item, index)">
  82. <i class="el-icon-delete" style="color:red;font-size:20px;"></i>
  83. </div>
  84. </div>
  85. <div class="addApprovel">
  86. <el-button type="primary" size="small" @click="addOne">
  87. <span class="d-in-block v-mid el-icon-plus font-size-16"></span>
  88. <span class="d-in-block v-mid font-size-16">添加</span>
  89. </el-button>
  90. </div>
  91. </div>
  92. </template>
  93. <el-form-item label="应用对象">
  94. <el-select v-model="dialogForm.applyObj" placeholder="请选择应用对象" @change="DXlinkNumber" filterable>
  95. <el-option v-for="item in orgLIST" :key="item.value" :label="item.label" :value="item">
  96. </el-option>
  97. </el-select>
  98. </el-form-item>
  99. <el-form-item label="起草公文">
  100. <el-select style="width: 100%" v-model="dialogForm.qcgwArr" placeholder="请选择起草公文人员" multiple filterable v-if="userListObj">
  101. <el-option v-for="item in userListObj " :key="item.value" :label="item.label" :value="item">
  102. </el-option>
  103. </el-select>
  104. </el-form-item>
  105. </el-form>
  106. <div slot="footer">
  107. <el-button @click="dialogFormVisible = false">取 消</el-button>
  108. <el-button type="primary" @click="formSubmit('addForm')">确 定</el-button>
  109. </div>
  110. </el-dialog>
  111. <!-- dialog弹出——详情 -->
  112. <el-dialog :title="title" :visible.sync="dialogFormVisible_detail">
  113. <el-form :model="form_detail">
  114. <el-form-item label="流程名称" :label-width="formLabelWidth_detail">
  115. <el-input v-model="form_detail.lcmc" autocomplete="off" :disabled="markDis"></el-input>
  116. </el-form-item>
  117. <el-form-item label="创建人" :label-width="formLabelWidth_detail">
  118. <el-input v-model="form_detail.cjr" autocomplete="off" :disabled="markDis"></el-input>
  119. </el-form-item>
  120. <el-form-item label="创建时间" :label-width="formLabelWidth_detail">
  121. <el-input v-model="form_detail.cjsj" autocomplete="off" :disabled="markDis"></el-input>
  122. </el-form-item>
  123. <el-form-item label="应用对象" :label-width="formLabelWidth_detail">
  124. <el-input v-model="form_detail.yydx" autocomplete="off" :disabled="markDis"></el-input>
  125. </el-form-item>
  126. <el-form-item label="是否启用" :label-width="formLabelWidth_detail">
  127. <el-input v-model="form_detail.sfqy" autocomplete="off" :disabled="markDis"></el-input>
  128. </el-form-item>
  129. </el-form>
  130. <div slot="footer" class="dialog-footer">
  131. <el-button @click="dialogFormVisible_detail = false">取 消</el-button>
  132. </div>
  133. </el-dialog>
  134. </div>
  135. </template>
  136. <script>
  137. import { lcgl_list, lcgl_add, lcgl_edit, lcgl_detail, lcgl_del, org_list, org_users } from "./itemApi";
  138. import { useUserStore } from "@/stores/user";
  139. const { real_name, dept_ids } = useUserStore();
  140. export default {
  141. name: "lcgl",
  142. data() {
  143. return {
  144. keyword: "",
  145. tableData: [],
  146. type_value: "",
  147. type_list: [
  148. {
  149. label: "全部",
  150. value: "0",
  151. },
  152. {
  153. label: "启用",
  154. value: "1",
  155. },
  156. {
  157. label: "未启用",
  158. value: "2",
  159. },
  160. ],
  161. shlxList: [
  162. {
  163. label: "对象1",
  164. value: "1",
  165. },
  166. {
  167. label: "对象2",
  168. value: "2",
  169. },
  170. {
  171. label: "对象3",
  172. value: "3",
  173. },
  174. ],
  175. btlxList: [
  176. {
  177. label: "加班",
  178. value: "1",
  179. },
  180. {
  181. label: "交通",
  182. value: "2",
  183. },
  184. {
  185. label: "餐补",
  186. value: "3",
  187. },
  188. ],
  189. limit: 10,
  190. total: 0,
  191. cur_page: 1,
  192. dialogFormVisible: false,
  193. dialogForm: {
  194. lcmc: '',
  195. qcgwArr: [],
  196. applyObj: ''
  197. },
  198. check_rules: {
  199. lcmc: [
  200. { required: true, message: '请输入项目类别名称', trigger: 'blur' }
  201. ],
  202. qcgwArr: [
  203. { required: true, message: '请选择起草公文人员', trigger: 'change' }
  204. ],
  205. applyObj: [
  206. { required: true, message: '请选择应用对象', trigger: 'change' }
  207. ]
  208. },
  209. title: "",
  210. isEdit: false,
  211. chooseId: "",
  212. loading: false,
  213. userList: [],
  214. userListObj: [],
  215. orgLIST: [],
  216. relUserList: [],
  217. addAll: [
  218. {
  219. detpart_all: '',
  220. checker_all: '',
  221. posts_name: '',
  222. }
  223. ],
  224. addDeptNum: [
  225. {
  226. detpartId: '',
  227. detpartName: '',
  228. checkerId: '',
  229. checker: '',
  230. }
  231. ],
  232. dialogFormVisible_detail: false,
  233. form_detail: {
  234. lcmc: '',
  235. cjr: '',
  236. cjsj: '',
  237. yydx: '',
  238. sfqy: '',
  239. },
  240. formLabelWidth_detail: '120px',
  241. markDis: false,
  242. dialog_loading: false,
  243. };
  244. },
  245. mounted() {
  246. // this.getUserList();
  247. this.orgList();
  248. this.getListData();
  249. },
  250. methods: {
  251. //用户名列表
  252. getUserList() {
  253. let transObj = {
  254. dept_id: dept_ids[0],
  255. all: '1',
  256. page: 1,
  257. limit: 9999,
  258. };
  259. org_users(transObj).then((res) => {
  260. if (res.code == 1) {
  261. this.userList = res.data.page_data;
  262. this.userListObj = [];
  263. this.userList.forEach(item => {
  264. this.userListObj.push({
  265. user_name: item.user_realname,
  266. user_id: item.user_id,
  267. });
  268. })
  269. }
  270. });
  271. },
  272. //组织机构列表
  273. orgList() {
  274. let transObjs = {
  275. limit: 999,
  276. uo_pid: '385',
  277. }
  278. org_list(transObjs)
  279. .then(res => {
  280. if (res.code == "1") {
  281. let singleData = res.data.page_data;
  282. singleData.forEach(item => {
  283. this.orgLIST.push({
  284. label: item.uo_name,
  285. value: item.uo_id
  286. })
  287. });
  288. }
  289. })
  290. .catch(err => { console.log(err) });
  291. },
  292. //初始化列表数据
  293. getListData() {
  294. this.loading = true;
  295. let data = {
  296. page: this.cur_page,
  297. limit: this.limit,
  298. keyword: this.keyword,
  299. lc_status: this.type_value,
  300. lc_fb_depart:2,//1 校端 2局端
  301. };
  302. lcgl_list(data).then((res) => {
  303. this.loading = false;
  304. this.tableData = res.data.page_data;
  305. this.cur_page = Number(res.data.page_now);
  306. this.total = Number(res.data.total_rows);
  307. });
  308. },
  309. //部门加1
  310. addOne() {
  311. this.addAll.push({
  312. detpart_all: '',
  313. checker_all: '',
  314. posts_name: '',
  315. });
  316. },
  317. //dialog-特定删除
  318. singleDel(item, index) {
  319. this.addAll.splice(index, 1);
  320. },
  321. //新增dialog-新增
  322. addData() {
  323. this.title = "新建流程";
  324. this.dialogForm = {
  325. lcmc: '',
  326. qcgwArr: [],
  327. applyObj: ''
  328. };
  329. this.addAll = [
  330. {
  331. detpart_all: '',
  332. checker_all: '',
  333. posts_name: '',
  334. }
  335. ];
  336. this.isEdit = false;
  337. this.dialogFormVisible = true;
  338. },
  339. // 编辑
  340. editData(item) {
  341. this.dialog_loading = true;
  342. this.title = "编辑流程";
  343. this.isEdit = true;
  344. this.chooseId = item.lc_id;
  345. let transObj = {
  346. lc_id: item.lc_id
  347. };
  348. lcgl_detail(transObj)
  349. .then(res => {
  350. if (res.code == "1") {
  351. let singleDATA = res.data.one_info;
  352. console.log(singleDATA, "allinfo")
  353. //起草公文人
  354. let transFormat = JSON.parse(singleDATA.lc_qcgw);
  355. let qcgwTempArr = []
  356. if (transFormat == "") { //流程为通用流程 无公文人员
  357. qcgwTempArr = []
  358. } else {
  359. transFormat.forEach(item => {
  360. qcgwTempArr.push({
  361. label: item.user_name,
  362. value: item.user_id
  363. })
  364. })
  365. }
  366. //流程的审核
  367. let transD = JSON.parse(singleDATA.lc_splc);
  368. this.addAll = [];
  369. transD.forEach(item => {
  370. this.changeDepLinkNumber(item.department_id)
  371. this.addAll.push({
  372. detpart_all: {
  373. value: item.department_id,
  374. label: item.department_name
  375. },
  376. checker_all: {
  377. label: item.user_name,
  378. value: item.user_id
  379. },
  380. posts_name: item.position,
  381. });
  382. this.dialog_loading = false;
  383. })
  384. this.dialogForm = {
  385. lcmc: singleDATA.lc_name,
  386. qcgwArr: qcgwTempArr,
  387. applyObj: { label: singleDATA.lc_yydx_name, value: singleDATA.lc_yydx },
  388. };
  389. console.log(this.dialogForm, '数据回填问题')
  390. }
  391. })
  392. .catch(err => { console.log(err) })
  393. this.dialogFormVisible = true;
  394. },
  395. //添加流程-提交
  396. formSubmit(formName) {
  397. this.$refs[formName].validate((valid) => {
  398. if (valid) {
  399. // 编辑上送json格式-审批流程
  400. let tempArr = []
  401. this.addAll.forEach(item => {
  402. tempArr.push({
  403. department_name: item.detpart_all.label,
  404. department_id: item.detpart_all.value,
  405. user_name: item.checker_all.label,
  406. user_id: item.checker_all.value,
  407. position: item.posts_name,//职位
  408. })
  409. })
  410. //编辑上送json格式-起草公文
  411. let temp_lc_qcgw = [];
  412. if (this.dialogForm.qcgwArr.label == "" && this.dialogForm.qcgwArr.value == "") {
  413. this.dialogForm.qcgwArr = "";
  414. } else {
  415. this.dialogForm.qcgwArr.forEach(item => {
  416. temp_lc_qcgw.push({
  417. user_name: item.label,
  418. user_id: item.value
  419. })
  420. })
  421. }
  422. let transObj = {
  423. issubmit: 1,
  424. jdbg_gwgl_lcgl: {
  425. lc_name: this.dialogForm.lcmc,
  426. lc_qcgw: JSON.stringify(temp_lc_qcgw),//[{"user_name":"审批人名称","user_id":"审批人id"}]说明:业务参数 起草公文用户json
  427. lc_yydx: this.dialogForm.applyObj.value,//应用对象id
  428. lc_yydx_name: this.dialogForm.applyObj.label,
  429. lc_status: 1,//是否启用
  430. lc_splc: JSON.stringify(tempArr),//示例值:[{"department_name":"部门名称","department_id":"部门id","user_name":"审批人名称","user_id":"审批人id","position":"职位"}]
  431. }
  432. };
  433. if (!this.isEdit) {
  434. lcgl_add(transObj).then((res) => {
  435. if (res.code == 1) {
  436. this.$message({
  437. message: res.msg,
  438. type: "success",
  439. });
  440. this.dialogFormVisible = false;
  441. this.getListData();
  442. } else {
  443. this.$message({
  444. message: res.msg,
  445. type: "error",
  446. });
  447. }
  448. });
  449. } else {
  450. transObj.lc_id = this.chooseId;
  451. lcgl_edit(transObj).then((res) => {
  452. if (res.code == 1) {
  453. this.$message({
  454. message: res.msg,
  455. type: "success",
  456. });
  457. this.dialogFormVisible = false;
  458. this.getListData();
  459. } else {
  460. this.$message({
  461. message: res.msg,
  462. type: "error",
  463. });
  464. }
  465. });
  466. }
  467. }
  468. })
  469. },
  470. //table中 switch开关
  471. changeStatus(val, item) {
  472. let transObj = {
  473. issubmit: 1,
  474. lc_id: item.lc_id,
  475. jdbg_gwgl_lcgl: {
  476. lc_status: val == true ? 1 : 2
  477. }
  478. }
  479. lcgl_edit(transObj)
  480. .then(res => {
  481. if (res.code == "1") {
  482. this.$message({
  483. message: res.msg,
  484. type: 'success'
  485. });
  486. this.getListData();
  487. }
  488. })
  489. .catch(err => { console.log(err) })
  490. },
  491. //详情
  492. detailData(item) {
  493. this.form_detail = {
  494. lcmc: item.lc_name,
  495. cjr: item.lc_qcgw,
  496. cjsj: item.create_dateline,
  497. yydx: item.lc_yydx_name == '' ? '全部门' : item.lc_yydx_name,
  498. sfqy: item.lc_status,
  499. };
  500. this.markDis = true;
  501. this.dialogFormVisible_detail = true;
  502. },
  503. //删除
  504. delData(item) {
  505. let _this = this;
  506. let transObj = {
  507. lc_id: item.lc_id,
  508. };
  509. this.$confirm("确认删除该设置?", "提示", {
  510. confirmButtonText: "确定",
  511. cancelButtonText: "取消",
  512. type: "warning",
  513. })
  514. .then(() => {
  515. lcgl_del(transObj).then((res) => {
  516. if (res.code == 1) {
  517. _this.$message({
  518. message: "删除成功!",
  519. type: "success",
  520. });
  521. _this.getListData();
  522. } else {
  523. _this.$message({
  524. message: res.msg,
  525. type: "error",
  526. });
  527. }
  528. });
  529. })
  530. .catch(() => { });
  531. },
  532. //点击-应用对象
  533. DXlinkNumber(val) {
  534. let _this = this;
  535. this.userListObj = [];
  536. let transObj = {
  537. dept_id: val.value,
  538. all: '1',
  539. page: 1,
  540. limit: 99999,
  541. };
  542. org_users(transObj).then((res) => {
  543. if (res.code == "1") {
  544. let changeData = res.data.page_data;
  545. let tempArrOne = [];
  546. changeData.forEach(item => {
  547. tempArrOne.push({
  548. label: item.user_realname,
  549. value: item.user_id,
  550. })
  551. });
  552. _this.userListObj = tempArrOne;
  553. }
  554. });
  555. },
  556. //选择部门后请求以下成员
  557. changeDepLinkNumber(val) {
  558. this.relUserList = [];
  559. let tempArr = [];
  560. let transObj = {
  561. dept_id: val.value,
  562. all: '1',
  563. page: 1,
  564. limit: 999,
  565. };
  566. org_users(transObj).then((res) => {
  567. if (res.code == "1") {
  568. let changeDa = res.data.page_data;
  569. changeDa.forEach(item => {
  570. tempArr.push({
  571. label: item.user_realname,
  572. value: item.user_id,
  573. })
  574. });
  575. this.relUserList = tempArr;
  576. }
  577. });
  578. },
  579. //翻页
  580. handleCurrentChange(val) {
  581. this.cur_page = val;
  582. this.getListData();
  583. },
  584. },
  585. };
  586. </script>
  587. <style lang="scss" scoped>
  588. table {
  589. tbody {
  590. tr {
  591. td {
  592. border: 1px #000 solid !important;
  593. }
  594. }
  595. }
  596. }
  597. .time-type-list {
  598. width: 100%;
  599. border-bottom: 1px solid #f3f3f3;
  600. margin-bottom: 20px;
  601. display: flex;
  602. li {
  603. position: relative;
  604. top: 2px;
  605. cursor: pointer;
  606. width: 50px;
  607. font-size: 14px;
  608. line-height: 30px;
  609. text-align: center;
  610. &+li {
  611. margin-left: 20px;
  612. }
  613. &.selected {
  614. color: #265cd4;
  615. border-bottom: 2px solid #265cd4;
  616. }
  617. }
  618. }
  619. .titleBi {
  620. margin-bottom: 20px;
  621. }
  622. .singleItem {
  623. display: flex;
  624. height: 40px;
  625. line-height: 40px;
  626. justify-content: space-between;
  627. margin-bottom: 10px;
  628. h4 {
  629. width: 14%;
  630. text-align: center;
  631. }
  632. .formItem {
  633. width: 30%;
  634. }
  635. .delIcon {
  636. width: 12%;
  637. box-sizing: border-box;
  638. padding-left: 5%;
  639. cursor: pointer;
  640. }
  641. }
  642. .addApprovel {
  643. margin-top: 40px;
  644. }</style>