workPersonScheduling-list.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
  1. <template>
  2. <div>
  3. <el-breadcrumb separator=">">
  4. <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
  5. <el-breadcrumb-item>
  6. <a href="#">系统管理</a>
  7. </el-breadcrumb-item>
  8. <el-breadcrumb-item>
  9. <a href="/workPersonScheduling">人员排班管理</a>
  10. </el-breadcrumb-item>
  11. </el-breadcrumb>
  12. <el-divider></el-divider>
  13. <!--
  14. 要resetFields起作用,必须配置:model和prop
  15. -->
  16. <el-form
  17. ref="queryForm"
  18. :model="queryModel"
  19. :rules="ruleValidate"
  20. inline
  21. class="demo-form-inline"
  22. >
  23. <el-form-item label="安排日期" prop="queryMonth">
  24. <el-date-picker
  25. v-model="queryModel.queryMonth"
  26. size="mini"
  27. type="month"
  28. value-format="yyyy-MM"
  29. placeholder="选择月"
  30. >
  31. </el-date-picker>
  32. </el-form-item>
  33. <el-form-item label="部门" prop="companyId">
  34. <el-select-tree
  35. size="mini"
  36. :props="props"
  37. :options="companyResult"
  38. v-model="queryModel.companyId"
  39. height="200"
  40. ></el-select-tree
  41. >&nbsp;
  42. <el-checkbox v-model="queryModel.subordinate"
  43. >是否包含下级单位</el-checkbox
  44. >
  45. </el-form-item>
  46. <el-form-item label="姓名" prop="personName">
  47. <el-input
  48. type="text"
  49. size="mini"
  50. v-model="queryModel.personName"
  51. style="width: 100px"
  52. ></el-input>
  53. </el-form-item>
  54. <el-form-item>
  55. <el-button
  56. type="primary"
  57. size="mini"
  58. icon="ios-search"
  59. @click="handleQuery('queryForm')"
  60. :loading="loading"
  61. >查询</el-button
  62. >&nbsp;
  63. <el-button
  64. type="info"
  65. size="mini"
  66. style="margin-left: 8px"
  67. @click="handleReset('queryForm')"
  68. >重置</el-button
  69. >&nbsp;
  70. </el-form-item>
  71. </el-form>
  72. <el-divider></el-divider>
  73. <el-row class="button-group">
  74. <el-button
  75. type="primary"
  76. size="small"
  77. plain
  78. icon="el-icon-circle-plus"
  79. @click="handleChange"
  80. >自动排班</el-button
  81. >
  82. </el-row>
  83. <el-table
  84. :data="tableData"
  85. v-loading="loading"
  86. ref="formTable"
  87. :height="tableHeight"
  88. stripe
  89. @sort-change="sortChange"
  90. @selection-change="handleSelectionChange"
  91. >
  92. <el-table-column type="selection" width="55"></el-table-column>
  93. <el-table-column
  94. type="index"
  95. label="序号"
  96. :index="indexMethod"
  97. width="50"
  98. ></el-table-column>
  99. <el-table-column
  100. prop="companyName"
  101. label="部门"
  102. width="90"
  103. ></el-table-column>
  104. <el-table-column prop="id" label="编号" width="90"></el-table-column>
  105. <el-table-column prop="name" label="名称" width="150"></el-table-column>
  106. <template v-for="col in dayList">
  107. <el-table-column
  108. :label="col.day + ''"
  109. :prop="col.id + ''"
  110. :key="col.id + ''"
  111. width="100px"
  112. >
  113. <template slot-scope="{ row }">
  114. <div style="display: flex; flex-direction: column">
  115. <template v-for="(item, index) in row.personNumberMap[col.day]">
  116. <div
  117. v-html="showItem(item)"
  118. :key="index"
  119. v-on:click="
  120. changeWork(row.companyId, row.id, row.name, col.day)
  121. "
  122. style="white-space: pre-wrap; cursor: pointer"
  123. ></div>
  124. </template>
  125. </div>
  126. </template>
  127. </el-table-column>
  128. </template>
  129. </el-table>
  130. <el-pagination
  131. :current-page.sync="pageIndex"
  132. :total="totalElements"
  133. :page-sizes="pageSizeList"
  134. @current-change="changePage"
  135. @size-change="pageSizeChange"
  136. layout="total, sizes, prev, pager, next, jumper"
  137. ></el-pagination>
  138. <workPersonScheduling-detail
  139. v-if="showModal"
  140. :businessKey="businessKey"
  141. :title="modalTitle"
  142. @close="onDetailModalClose"
  143. ></workPersonScheduling-detail>
  144. <workPersonScheduling-change
  145. v-if="showChangeModal"
  146. :businessKey="businessKey"
  147. :title="modalTitle"
  148. @close="onDetailModalClose"
  149. ></workPersonScheduling-change>
  150. <!-- 批量解绑设备 -->
  151. <el-dialog
  152. title="调班"
  153. :visible.sync="batchChangeWork"
  154. :modal-append-to-body="false"
  155. style="text-align: left"
  156. :close-on-click-modal="false"
  157. >
  158. <el-form label-width="150px" v-loading="changeWorkDisabled">
  159. <el-form-item label="用户" prop="changeUser">
  160. <el-input
  161. type="text"
  162. v-model="changeUser"
  163. disabled
  164. style="width: 200px"
  165. ></el-input>
  166. </el-form-item>
  167. <el-form-item label="部门" prop="changeCompanyId">
  168. <el-select-tree
  169. :props="props"
  170. :options="companyResult"
  171. v-model="changeCompanyId"
  172. height="200"
  173. ></el-select-tree>
  174. </el-form-item>
  175. <el-form-item label="班次" prop="changeShiftId">
  176. <el-select
  177. v-model="changeShiftId"
  178. filterable
  179. multiple
  180. placeholder="请选择"
  181. >
  182. <el-option
  183. v-for="shift in shiftData"
  184. :key="shift.id"
  185. :label="shift.name"
  186. :value="shift.id"
  187. ></el-option>
  188. </el-select>
  189. </el-form-item>
  190. </el-form>
  191. <div slot="footer" class="dialog-footer">
  192. <el-button @click="closeBatchChangeWork">关 闭</el-button>
  193. <el-button type="primary" @click="handleBatchChangeWork"
  194. >确 定</el-button
  195. >
  196. </div>
  197. </el-dialog>
  198. <!-- 批量解绑设备end -->
  199. </div>
  200. </template>
  201. <script>
  202. import Constant from "@/constant";
  203. import WorkPersonSchedulingDetail from "./workPersonScheduling-detail";
  204. import WorkPersonSchedulingChange from "./workPersonScheduling-change";
  205. import workPersonSchedulingApi from "@/api/base/workPersonScheduling";
  206. import workShiftInfoApi from "@/api/base/workShiftInfo";
  207. import companyInfoApi from "@/api/base/companyInfo";
  208. import pageUtil from "@/utils/page";
  209. import SelectTree from "@/components/SelectTree";
  210. import NProgress from "nprogress"; // progress bar
  211. import "nprogress/nprogress.css"; // progress bar style
  212. export default {
  213. name: "BaseWorkPersonSchedulingList",
  214. data() {
  215. var self = this;
  216. return {
  217. ruleValidate: {
  218. companyId: [{ required: true, message: "不能为空", trigger: "blur" }],
  219. queryMonth: [{ required: true, message: "请选择", trigger: "blur" }],
  220. },
  221. queryModel: {
  222. personName: "",
  223. queryMonth: "",
  224. companyId: "",
  225. subordinate: false,
  226. },
  227. loading: false,
  228. tableData: [],
  229. pageIndex: 1,
  230. pageSize: 10,
  231. totalPages: 0,
  232. totalElements: 0,
  233. field: "",
  234. direction: "",
  235. pageSizeList: [10, 20, 30],
  236. multipleSelection: [],
  237. showModal: false,
  238. modalTitle: "",
  239. businessKey: "",
  240. treeData: [],
  241. props: {
  242. // 配置项(必选)
  243. value: "id",
  244. label: "name",
  245. children: "children",
  246. },
  247. companyResult: [],
  248. dayList: [],
  249. tableHeight: 300,
  250. showChangeModal: false,
  251. batchChangeWork: false,
  252. changePersonId: "",
  253. changeDay: "",
  254. changeCompanyId: "",
  255. shiftData: [],
  256. changeShiftId: [],
  257. changeWorkDisabled: false,
  258. changeUser: "",
  259. };
  260. },
  261. created() {
  262. var self = this;
  263. companyInfoApi.treeList().then(function (response) {
  264. var jsonData = response.data;
  265. if (jsonData.result) {
  266. if (jsonData.data != null && jsonData.data != "") {
  267. self.companyResult = jsonData.data;
  268. }
  269. }
  270. });
  271. },
  272. watch: {
  273. changeCompanyId: function (val, oldval) {
  274. if (val != null && val != "") {
  275. this.queryShiftInfo(val);
  276. }
  277. },
  278. },
  279. methods: {
  280. handleQuery() {
  281. var self = this;
  282. this.$refs["queryForm"].validate((valid) => {
  283. if (valid) {
  284. self.changePage(1);
  285. }
  286. });
  287. },
  288. showItem(item) {
  289. var str = item;
  290. if (item == null || item == "") {
  291. str = " ";
  292. }
  293. return str;
  294. },
  295. indexMethod(index) {
  296. return (this.pageIndex - 1) * this.pageSize + (index + 1);
  297. },
  298. changePage(pageIndex) {
  299. var self = this;
  300. self.loading = true;
  301. self.pageIndex = pageIndex;
  302. var formData = new FormData();
  303. formData.append("pageIndex", self.pageIndex);
  304. formData.append("pageSize", self.pageSize);
  305. formData.append("personName", self.queryModel.personName);
  306. formData.append("queryMonth", self.queryModel.queryMonth);
  307. formData.append("companyId", self.queryModel.companyId);
  308. formData.append("subordinate", self.queryModel.subordinate);
  309. if (this.field != null) {
  310. formData.append("field", this.field);
  311. }
  312. if (this.direction != null) {
  313. formData.append("direction", this.direction);
  314. }
  315. workPersonSchedulingApi
  316. .findScheduling(formData)
  317. .then(function (response) {
  318. self.loading = false;
  319. var jsonData = response.data;
  320. self.tableData = jsonData.personList;
  321. self.totalPages = jsonData.totalPage;
  322. self.totalElements = jsonData.recordsTotal;
  323. self.dayList = jsonData.dayList;
  324. setTimeout(() => {
  325. console.log(self.$refs.formTable.$el.offsetTop);
  326. self.tableHeight = pageUtil.autoAdjustHeight(
  327. self.$refs.formTable.$el
  328. );
  329. }, 1000);
  330. })
  331. .catch((error) => {
  332. self.loading = false;
  333. // self.$message.error(error + "");
  334. });
  335. },
  336. pageSizeChange(pageSize) {
  337. this.pageSize = pageSize;
  338. this.$nextTick(() => {
  339. this.changePage(this.pageIndex);
  340. });
  341. },
  342. sortChange(data) {
  343. this.field = data.column.field;
  344. this.direction = data.order;
  345. this.changePage(this.pageIndex);
  346. },
  347. handleSelectionChange(val) {
  348. this.multipleSelection = val;
  349. },
  350. handleReset(name) {
  351. this.$refs[name].resetFields();
  352. },
  353. handleChange() {
  354. this.modalTitle = "自动排班";
  355. this.businessKey = "";
  356. this.showChangeModal = true;
  357. },
  358. onDetailModalClose(refreshed) {
  359. //保存成功后回调
  360. this.showModal = false;
  361. this.showChangeModal = false;
  362. if (refreshed) {
  363. this.handleQuery();
  364. }
  365. },
  366. changeWork(companyId, personId, personName, day) {
  367. var self = this;
  368. self.changePersonId = personId;
  369. self.changeDay = day;
  370. self.changeUser = personName + ",调班日期:" + day + "日";
  371. self.changeCompanyId = companyId;
  372. var formData = new FormData();
  373. formData.append("queryMonth", self.queryModel.queryMonth);
  374. formData.append("day", day);
  375. formData.append("personId", personId);
  376. workPersonSchedulingApi
  377. .findWPSByParameter(formData)
  378. .then(function (response) {
  379. var jsonData = response.data;
  380. if (jsonData.result) {
  381. var shiftIds = jsonData.data.shiftIds;
  382. if (shiftIds != null) {
  383. self.changeShiftId = shiftIds.split(",");
  384. }
  385. } else {
  386. self.$message({
  387. showClose: true,
  388. dangerouslyUseHTMLString: true,
  389. message: jsonData.message,
  390. });
  391. }
  392. });
  393. this.batchChangeWork = true;
  394. },
  395. handleBatchChangeWork() {
  396. var self = this;
  397. var formData = new FormData();
  398. formData.append("queryMonth", self.queryModel.queryMonth);
  399. formData.append("day", self.changeDay);
  400. formData.append("personId", self.changePersonId);
  401. formData.append("shiftId", self.changeShiftId);
  402. workPersonSchedulingApi
  403. .changePersonShift(formData)
  404. .then(function (response) {
  405. var jsonData = response.data;
  406. if (jsonData.result) {
  407. self.changeDay = "";
  408. self.changePersonId = "";
  409. self.changeShiftId = "";
  410. self.changeCompanyId = "";
  411. self.changePage(1);
  412. self.batchChangeWork = false;
  413. } else {
  414. self.$message({
  415. showClose: true,
  416. dangerouslyUseHTMLString: true,
  417. message: jsonData.message,
  418. });
  419. }
  420. });
  421. },
  422. closeBatchChangeWork() {
  423. this.changePersonId = "";
  424. this.changeDay = "";
  425. this.batchChangeWork = false;
  426. },
  427. queryShiftInfo(companyId) {
  428. var self = this;
  429. var formData = new FormData();
  430. formData.append("companyId", companyId);
  431. workShiftInfoApi.shiftList(formData).then(function (response) {
  432. var jsonData = response.data;
  433. if (jsonData.result) {
  434. if (jsonData.data != null && jsonData.data != "") {
  435. self.shiftData = jsonData.data;
  436. }
  437. }
  438. });
  439. },
  440. },
  441. mounted: function () {
  442. //this.changePage(1);
  443. },
  444. components: {
  445. "workPersonScheduling-detail": WorkPersonSchedulingDetail,
  446. "workPersonScheduling-change": WorkPersonSchedulingChange,
  447. "el-select-tree": SelectTree,
  448. },
  449. };
  450. </script>
  451. <style lang="scss" scoped>
  452. .el-breadcrumb {
  453. margin: 10px;
  454. line-height: 20px;
  455. }
  456. .el-divider {
  457. margin: 5px 0;
  458. }
  459. .demo-form-inline {
  460. margin-left: 10px;
  461. text-align: left;
  462. }
  463. .button-group {
  464. margin-left: 10px;
  465. text-align: left;
  466. }
  467. </style>