workPersonScheduling-change.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741
  1. <template>
  2. <el-dialog
  3. :visible.sync="showDialog"
  4. :title="title"
  5. :modal-append-to-body="false"
  6. width="700px"
  7. style="text-align: left"
  8. @close="closeDialog"
  9. :close-on-click-modal="false"
  10. v-loading="loading"
  11. >
  12. <div>
  13. <el-form
  14. ref="queryForm"
  15. :model="queryModel"
  16. inline
  17. :rules="ruleValidate"
  18. class="demo-form-inline"
  19. >
  20. <el-row>
  21. <el-col>
  22. <el-form-item label="排班日期" prop="timeRanges">
  23. <el-date-picker
  24. v-model="queryModel.timeRanges"
  25. type="daterange"
  26. range-separator="至"
  27. start-placeholder="开始日期"
  28. end-placeholder="结束日期"
  29. value-format="yyyy-MM-dd"
  30. :default-time="timeRangesDefaultTime"
  31. size="mini"
  32. ></el-date-picker>
  33. </el-form-item>
  34. </el-col>
  35. </el-row>
  36. <el-row>
  37. <el-col :span="24">
  38. <el-form-item label="部门" prop="companyId">
  39. <el-select-tree
  40. size="mini"
  41. :props="props"
  42. :options="companyResult"
  43. v-model="queryModel.companyId"
  44. height="200"
  45. ></el-select-tree>
  46. </el-form-item>
  47. <el-form-item label="员工" prop="personId">
  48. <el-select
  49. filterable
  50. multiple
  51. v-model="queryModel.personId"
  52. clearable
  53. size="mini"
  54. style="width: 200px"
  55. >
  56. <el-option
  57. v-for="person in personInfoData"
  58. :key="person.id"
  59. :value="person.id"
  60. :label="person.name"
  61. >
  62. </el-option>
  63. </el-select>
  64. </el-form-item>
  65. <el-form-item>
  66. <el-button
  67. type="primary"
  68. size="mini"
  69. icon="ios-search"
  70. @click="handleQuery('queryForm')"
  71. :loading="loading"
  72. >查询</el-button
  73. >
  74. </el-form-item>
  75. </el-col>
  76. </el-row>
  77. </el-form>
  78. <div class="von-cho">
  79. <div class="von-left">
  80. <div class="von-tit">可选班次</div>
  81. <ul>
  82. <li v-for="shift in shiftData" :key="shift.id">
  83. <a
  84. href="#"
  85. @click="selectShift(shift)"
  86. v-if="selectId == shift.id"
  87. class="active"
  88. >{{ shift.number }} - {{ shift.name }}</a
  89. >
  90. <a href="#" @click="selectShift(shift)" v-else
  91. >{{ shift.number }} - {{ shift.name }}</a
  92. >
  93. </li>
  94. </ul>
  95. </div>
  96. <div class="von-center">
  97. <el-button round size="mini" @click="moveUp">选择</el-button>
  98. <div style="height: 10px"></div>
  99. <el-button round size="mini" @click="moveDown">移除</el-button>
  100. </div>
  101. <div class="von-right">
  102. <div class="von-right-top">
  103. <div class="von-tit">排班规律表</div>
  104. <ul>
  105. <li>
  106. <a
  107. href="#"
  108. v-if="showTagNum == 1"
  109. class="active"
  110. @click="changeTag('1')"
  111. >一</a
  112. >
  113. <a href="#" v-else @click="changeTag('1')">一</a>
  114. <p>{{ number1 }}</p>
  115. </li>
  116. <li>
  117. <a
  118. href="#"
  119. v-if="showTagNum == 2"
  120. class="active"
  121. @click="changeTag('2')"
  122. >二</a
  123. >
  124. <a href="#" v-else @click="changeTag('2')">二</a>
  125. <p>{{ number2 }}</p>
  126. </li>
  127. <li>
  128. <a
  129. href="#"
  130. v-if="showTagNum == 3"
  131. class="active"
  132. @click="changeTag('3')"
  133. >三</a
  134. >
  135. <a href="#" v-else @click="changeTag('3')">三</a>
  136. <p>{{ number3 }}</p>
  137. </li>
  138. <li>
  139. <a
  140. href="#"
  141. v-if="showTagNum == 4"
  142. class="active"
  143. @click="changeTag('4')"
  144. >四</a
  145. >
  146. <a href="#" v-else @click="changeTag('4')">四</a>
  147. <p>{{ number4 }}</p>
  148. </li>
  149. <li>
  150. <a
  151. href="#"
  152. v-if="showTagNum == 5"
  153. class="active"
  154. @click="changeTag('5')"
  155. >五</a
  156. >
  157. <a href="#" v-else @click="changeTag('5')">五</a>
  158. <p>{{ number5 }}</p>
  159. </li>
  160. <li>
  161. <a
  162. href="#"
  163. v-if="showTagNum == 6"
  164. class="active"
  165. @click="changeTag('6')"
  166. >六</a
  167. >
  168. <a href="#" v-else @click="changeTag('6')">六</a>
  169. <p>{{ number6 }}</p>
  170. </li>
  171. <li>
  172. <a
  173. href="#"
  174. v-if="showTagNum == 7"
  175. class="active"
  176. @click="changeTag('7')"
  177. >七</a
  178. >
  179. <a href="#" v-else @click="changeTag('7')">七</a>
  180. <p>{{ number7 }}</p>
  181. </li>
  182. </ul>
  183. </div>
  184. <div class="von-right-bot">
  185. <el-tag
  186. v-for="tag in showWorkTags"
  187. :key="tag.number"
  188. :value="tag.id"
  189. closable
  190. @close="closeTag(tag)"
  191. >{{ tag.name }}</el-tag
  192. >
  193. </div>
  194. </div>
  195. </div>
  196. </div>
  197. <span slot="footer" class="dialog-footer">
  198. <el-button @click="closeDialog">取 消</el-button>
  199. <el-button type="primary" @click="handleSubmit" :loading="submitting"
  200. >确 定</el-button
  201. >
  202. </span>
  203. </el-dialog>
  204. </template>
  205. <script>
  206. import Constant from "@/constant";
  207. import workPersonSchedulingApi from "@/api/base/workPersonScheduling";
  208. import workShiftInfoApi from "@/api/base/workShiftInfo";
  209. import companyInfoApi from "@/api/base/companyInfo";
  210. import personRoleApi from "@/api/base/personRoleInfo";
  211. import personInfoApi from "@/api/base/personInfo";
  212. import SelectTree from "@/components/SelectTree";
  213. export default {
  214. props: ["businessKey", "title"],
  215. data() {
  216. return {
  217. queryModel: {
  218. companyId: "",
  219. timeRanges: "",
  220. personId: "",
  221. },
  222. formModel: {},
  223. ruleValidate: {
  224. timeRanges: [
  225. { required: true, message: "请选择日期", trigger: "blur" },
  226. ],
  227. companyId: [
  228. { required: true, message: "请选择排班部门", trigger: "blur" },
  229. ],
  230. },
  231. showDialog: true,
  232. loading: false,
  233. submitting: false,
  234. companyResult: [],
  235. props: {
  236. // 配置项(必选)
  237. value: "id",
  238. label: "name",
  239. children: "children",
  240. },
  241. timeRangesDefaultTime: [],
  242. menuList: [],
  243. relatedMenus: [],
  244. rightCheckedItems: [],
  245. tableData: [],
  246. shiftData: [],
  247. uploadTags: [],
  248. schedulingIds: [],
  249. showName: "",
  250. showId: "",
  251. showNumber: "",
  252. showTagNum: "",
  253. currentRow: "",
  254. leftClickType: false,
  255. rightClickType: false,
  256. number1: "无",
  257. number2: "无",
  258. number3: "无",
  259. number4: "无",
  260. number5: "无",
  261. number6: "无",
  262. number7: "无",
  263. personInfoData: [],
  264. selectId: "",
  265. showWorkTags: [],
  266. showWorkTag1: [],
  267. showWorkTag2: [],
  268. showWorkTag3: [],
  269. showWorkTag4: [],
  270. showWorkTag5: [],
  271. showWorkTag6: [],
  272. showWorkTag7: [],
  273. numberArray1: [],
  274. numberArray2: [],
  275. numberArray3: [],
  276. numberArray4: [],
  277. numberArray5: [],
  278. numberArray6: [],
  279. numberArray7: [],
  280. };
  281. },
  282. created() {
  283. var self = this;
  284. companyInfoApi.treeList().then(function (response) {
  285. var jsonData = response.data;
  286. if (jsonData.result) {
  287. if (jsonData.data != null && jsonData.data != "") {
  288. self.companyResult = jsonData.data;
  289. self.tableData = jsonData.data;
  290. }
  291. }
  292. });
  293. },
  294. watch: {
  295. "queryModel.companyId": function (val, oldval) {
  296. if (val != null && val != "") {
  297. var self = this;
  298. var formData = new FormData();
  299. formData.append("companyId", val);
  300. personInfoApi.findByCompanyId(formData).then(function (response) {
  301. var jsonData = response.data;
  302. if (jsonData.result) {
  303. if (jsonData.data != null && jsonData.data != "") {
  304. self.personInfoData = jsonData.data;
  305. }
  306. }
  307. });
  308. }
  309. },
  310. },
  311. methods: {
  312. closeDialog() {
  313. this.$emit("close", false);
  314. },
  315. handleSubmit() {
  316. var self = this;
  317. this.$refs["queryForm"].validate((valid) => {
  318. if (valid) {
  319. var self = this;
  320. self.loading = true;
  321. var startDate = "";
  322. var endDate = "";
  323. var timeRanges = self.queryModel.timeRanges + "";
  324. if (timeRanges != "" && timeRanges != null) {
  325. timeRanges = timeRanges.split(",");
  326. startDate = timeRanges[0];
  327. endDate = timeRanges[1];
  328. }
  329. var formData = new FormData();
  330. formData.append("startDate", startDate);
  331. formData.append("endDate", endDate);
  332. //formData.append("schedulingIds", self.schedulingIds);
  333. formData.append("companyId", self.queryModel.companyId);
  334. formData.append("personId", self.queryModel.personId);
  335. //formData.append("companyId", "ee25ae8d-d102-4fcd-8d58-71e40f413337");
  336. var numberArray1 = [];
  337. var numberArray2 = [];
  338. var numberArray3 = [];
  339. var numberArray4 = [];
  340. var numberArray5 = [];
  341. var numberArray6 = [];
  342. var numberArray7 = [];
  343. for (var i = 1; i < 8; i++) {
  344. self["showWorkTag" + i].forEach((item, index) => {
  345. self["numberArray" + i].push(item.id);
  346. });
  347. var num = self["numberArray" + i].join(";");
  348. if (num != null && num != "") {
  349. self.schedulingIds.push(num);
  350. }
  351. }
  352. // self.showWorkTag1.forEach((item, index) => {
  353. // numberArray1.push(item.id);
  354. // });
  355. // var numberArray2 = [];
  356. // self.showWorkTag2.forEach((item, index) => {
  357. // numberArray2.push(item.id);
  358. // });
  359. // var numberArray3 = [];
  360. // self.showWorkTag3.forEach((item, index) => {
  361. // numberArray3.push(item.id);
  362. // });
  363. // var numberArray4 = [];
  364. // self.showWorkTag4.forEach((item, index) => {
  365. // numberArray4.push(item.id);
  366. // });
  367. // var numberArray5 = [];
  368. // self.showWorkTag5.forEach((item, index) => {
  369. // numberArray5.push(item.id);
  370. // });
  371. // var numberArray6 = [];
  372. // self.showWorkTag6.forEach((item, index) => {
  373. // numberArray6.push(item.id);
  374. // });
  375. // var numberArray7 = [];
  376. // self.showWorkTag7.forEach((item, index) => {
  377. // numberArray7.push(item.id);
  378. // });
  379. // var num1 = numberArray1.join(";");
  380. // var num2 = numberArray1.join(";");
  381. // self.schedulingIds.push(num1);
  382. // self.schedulingIds.push(num1);
  383. // self.schedulingIds["3"] = numberArray3;
  384. // self.schedulingIds["4"] = numberArray4;
  385. // self.schedulingIds["5"] = numberArray5;
  386. // self.schedulingIds["6"] = numberArray6;
  387. // self.schedulingIds["7"] = numberArray7;
  388. formData.append("schedulingIds", self.schedulingIds);
  389. workPersonSchedulingApi
  390. .changeScheduling(formData)
  391. .then(function (response) {
  392. var jsonData = response.data;
  393. self.loading = false;
  394. if (jsonData.result) {
  395. self.$message({
  396. message: "保存成功!",
  397. type: "success",
  398. });
  399. self.$emit("close", true);
  400. } else {
  401. self.$message({
  402. message: jsonData.message + "",
  403. type: "warning",
  404. });
  405. self.$emit("close", false);
  406. }
  407. });
  408. }
  409. });
  410. },
  411. handleQuery() {
  412. var self = this;
  413. this.$refs["queryForm"].validate((valid) => {
  414. if (valid) {
  415. self.queryShiftInfo();
  416. }
  417. });
  418. },
  419. queryShiftInfo() {
  420. var self = this;
  421. var formData = new FormData();
  422. formData.append("companyId", self.queryModel.companyId);
  423. //formData.append("companyId", "ee25ae8d-d102-4fcd-8d58-71e40f413337");
  424. workShiftInfoApi.shiftList(formData).then(function (response) {
  425. var jsonData = response.data;
  426. if (jsonData.result) {
  427. if (jsonData.data != null && jsonData.data != "") {
  428. self.shiftData = jsonData.data;
  429. }
  430. }
  431. });
  432. },
  433. changeTag(tagNum) {
  434. var self = this;
  435. self.showTagNum = tagNum;
  436. var tagsName = "showWorkTag" + self.showTagNum;
  437. self.showWorkTags = this[tagsName];
  438. // if (self.uploadTags[tagNum] != null) {
  439. // this.showName = self.uploadTags[tagNum];
  440. // self.rightClickType = true;
  441. // } else {
  442. // self.rightClickType = false;
  443. // self.leftClickType = true;
  444. // }
  445. },
  446. handleCurrentChange(val) {
  447. this.currentRow = val;
  448. },
  449. moveUp() {
  450. var self = this;
  451. if (this.currentRow != "" && self.currentRow != null) {
  452. var flag = true;
  453. if (this.showWorkTags != null) {
  454. this.showWorkTags.forEach((item, index) => {
  455. if (item.id == self.currentRow.id) {
  456. flag = false;
  457. }
  458. });
  459. }
  460. if (flag) {
  461. var tag = {
  462. id: self.currentRow.id,
  463. number: self.currentRow.number,
  464. name: self.currentRow.name,
  465. };
  466. var tagsName = "showWorkTag" + self.showTagNum;
  467. self.showWorkTags.push(tag);
  468. self[tagsName] = self.showWorkTags;
  469. var numberName = "number" + self.showTagNum;
  470. // var nums = [];
  471. // self.showWorkTags.forEach((item, index) => {
  472. // nums.push(item.number);
  473. // });
  474. //var num = nums.join(",");
  475. self[numberName] = "√";
  476. //self.showId = self.currentRow.id + ",";
  477. //self.schedulingIds[self.showTagNum] = self.showWorkTags;
  478. }
  479. // if (this.showTagNum != "" && self.showTagNum != null) {
  480. // self.showId = self.currentRow.id;
  481. // self.showName = self.currentRow.name;
  482. // self.showNumber = self.currentRow.number;
  483. // self.leftClickType = true;
  484. // self.rightClickType = true;
  485. // self.uploadTags[this.showTagNum] = self.showName;
  486. // self.schedulingIds[this.showTagNum] = self.showId;
  487. // var numberName = "number" + self.showTagNum;
  488. // self[numberName] = self.showNumber;
  489. // self.selectId = self.currentRow.id;
  490. // var tag = {
  491. // id: self.currentRow.id,
  492. // number: self.currentRow.number,
  493. // name: self.currentRow.name,
  494. // };
  495. // self.showWorkTags.push(tag);
  496. // }
  497. }
  498. },
  499. moveDown() {
  500. var self = this;
  501. // if (this.showTagNum != "" && this.showTagNum != null) {
  502. // this.uploadTags[this.showTagNum] = null;
  503. // this.schedulingIds[this.showTagNum] = null;
  504. // this.rightClickType = false;
  505. // var numberName = "number" + this.showTagNum;
  506. // this[numberName] = "0";
  507. // this.selectId = "";
  508. // var tag = {
  509. // id: self.currentRow.id,
  510. // number: self.currentRow.number,
  511. // name: self.currentRow.name,
  512. // };
  513. // self.showWorkTags.splice(tag, 1);
  514. // }
  515. if (this.currentRow != "" && self.currentRow != null) {
  516. if (self.showWorkTags != null) {
  517. var tag = {
  518. id: self.currentRow.id,
  519. number: self.currentRow.number,
  520. name: self.currentRow.name,
  521. };
  522. this.showWorkTags.splice(this.showWorkTags.indexOf(tag), 1);
  523. var tagsName = "showWorkTag" + self.showTagNum;
  524. this.showWorkTags.splice(this.showWorkTags.indexOf(tag), 1);
  525. this.self[tagsName].splice(this.showWorkTags.indexOf(tag), 1);
  526. }
  527. }
  528. },
  529. closeTag(tag) {
  530. if (this.showWorkTags != null) {
  531. this.showWorkTags.splice(this.showWorkTags.indexOf(tag), 1);
  532. }
  533. // if (this.showTagNum != "" && this.showTagNum != null) {
  534. // this.uploadTags[this.showTagNum] = null;
  535. // this.schedulingIds[this.showTagNum] = null;
  536. // this.rightClickType = false;
  537. // var numberName = "number" + this.showTagNum;
  538. // this[numberName] = "0";
  539. // this.selectId = "";
  540. // }
  541. },
  542. selectShift(shift) {
  543. this.currentRow = shift;
  544. this.selectId = shift.id;
  545. },
  546. },
  547. mounted() {
  548. //this.queryRelatedMenuList();
  549. },
  550. components: {
  551. "el-select-tree": SelectTree,
  552. },
  553. };
  554. </script>
  555. <style scoped>
  556. .user-panel {
  557. margin: 10px auto;
  558. }
  559. </style>
  560. <style lang="scss">
  561. .flex-row {
  562. display: flex;
  563. flex-direction: row;
  564. }
  565. .flex-col {
  566. display: flex;
  567. flex-direction: col;
  568. justify-content: center; /* 水平居中 */
  569. align-items: center; /* 垂直居中 */
  570. }
  571. </style>
  572. <style>
  573. * {
  574. margin: 0;
  575. padding: 0;
  576. }
  577. li {
  578. list-style: none;
  579. }
  580. a {
  581. text-decoration: none;
  582. color: #101010;
  583. }
  584. body {
  585. font-size: 14px;
  586. color: #101010;
  587. font-family: Gotham, "Helvetica Neue", Helvetica, Arial, "sans-serif";
  588. }
  589. .von-cho {
  590. display: flex;
  591. align-items: center;
  592. height: 332px;
  593. justify-content: space-between;
  594. }
  595. .von-left,
  596. .von-right {
  597. height: 100%;
  598. width: 40%;
  599. }
  600. .von-left,
  601. .von-right-top,
  602. .von-right-bot {
  603. border: 1px solid #eaedf4;
  604. border-radius: 5px;
  605. overflow: hidden;
  606. }
  607. .von-right-bot {
  608. padding: 11px 15px;
  609. }
  610. .von-tit {
  611. background: #f3f6f9;
  612. padding: 11px 15px;
  613. font-size: 16px;
  614. }
  615. .von-left ul {
  616. overflow-y: scroll;
  617. height: 100%;
  618. padding: 10px 0;
  619. }
  620. .von-left li,
  621. .von-center {
  622. display: flex;
  623. flex-flow: column;
  624. }
  625. .von-left li a {
  626. padding: 5px 15px;
  627. display: block;
  628. overflow: hidden;
  629. white-space: nowrap;
  630. text-overflow: ellipsis;
  631. }
  632. .von-left li .active {
  633. background: #f3f6f9;
  634. color: #3894ff;
  635. }
  636. .von-center button {
  637. padding: 5px 15px;
  638. margin: 5px 10px;
  639. border-radius: 5px;
  640. box-shadow: initial;
  641. }
  642. .von-right {
  643. display: flex;
  644. flex-flow: column;
  645. justify-content: space-between;
  646. }
  647. .von-right-top {
  648. margin-bottom: 10px;
  649. }
  650. .von-right-top ul {
  651. display: flex;
  652. justify-content: space-between;
  653. padding: 10px;
  654. }
  655. .von-right-top ul li {
  656. color: #888;
  657. font-size: 12px;
  658. display: flex;
  659. flex-flow: column;
  660. align-items: center;
  661. margin-bottom: 10px;
  662. }
  663. .von-right-top ul li a {
  664. display: block;
  665. margin-bottom: 5px;
  666. width: 24px;
  667. height: 24px;
  668. line-height: 24px;
  669. text-align: center;
  670. }
  671. .von-right-top ul li .active {
  672. border-radius: 50%;
  673. background: rgba(22, 119, 255, 0.25);
  674. }
  675. .von-right-top ul li p {
  676. width: 16px;
  677. height: 16px;
  678. line-height: 16px;
  679. border-radius: 50%;
  680. background: #1677ff;
  681. color: white;
  682. text-align: center;
  683. font-size: 80%;
  684. }
  685. /* .von-right-top ul li:last-child p {
  686. background: #33bb00;
  687. } */
  688. .von-right-bot {
  689. flex: 1;
  690. }
  691. .von-right-bot ul {
  692. padding: 5px;
  693. display: flex;
  694. flex-wrap: wrap;
  695. }
  696. .von-right-bot ul li {
  697. background: #d0deff;
  698. border: 1px solid #7ca5df;
  699. padding: 3px 5px;
  700. margin: 5px;
  701. border-radius: 3px;
  702. }
  703. .von-right-bot ul li a {
  704. margin-left: 5px;
  705. color: #5682bf;
  706. }
  707. </style>