dialog.add.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. <template>
  2. <div class="question-infos">
  3. <DialogCom title="新增作息" @close="handleClose" :visible.sync="isShow" :close-on-click-modal="false"
  4. custom-class="gxDialog" width="1320px" append-to-body>
  5. <!-- <div class="p-5 work-time">-->
  6. <el-form label-width="90px" label-suffix="" label-position="right">
  7. <el-form-item label="分配机构">
  8. <org-tree-select ref="orgTreeSelect" :checkShow="true" v-model="orgIdList"></org-tree-select>
  9. </el-form-item >
  10. <el-form-item label="调整日期">
  11. <el-button type="primary" @click="addData">新增日期</el-button>
  12. </el-form-item>
  13. <!-- -->
  14. <el-form-item label="作息规则">
  15. <el-table class="w-auto" height="350" border :data="workTimeList">
  16. <el-table-column label="日期" width="160" align="center">
  17. <template slot-scope="r" >
  18. <el-date-picker
  19. :default-timezone="'GMT+8'"
  20. style="width: 100%"
  21. v-model="r.row.ymdDate"
  22. size="mini"
  23. :clearable=false
  24. popper-class="no-atTheMoment"
  25. :picker-options="startDatepickerOptions"
  26. type="date"
  27. placeholder="请选择日期">
  28. </el-date-picker>
  29. </template>
  30. </el-table-column>
  31. <el-table-column label="星期" width="80" align="center">
  32. <template slot-scope="r">
  33. <span>{{parseTime(r.row.ymdDate ,'dddd')}}</span>
  34. </template>
  35. </el-table-column>
  36. <el-table-column label="状态" width="160" align="center">
  37. <template slot-scope="r">
  38. <!-- <el-switch-->
  39. <!-- v-model="r.row.isEnable"-->
  40. <!-- :active-value="1"-->
  41. <!-- :inactive-value="0"-->
  42. <!-- @change="onEnableChange(r.row)"-->
  43. <!-- active-text="营业"-->
  44. <!-- inactive-text="歇业">-->
  45. <!-- </el-switch>-->
  46. <el-radio-group
  47. :disabled="r.row.disabled"
  48. v-model="r.row.isEnable"
  49. @change="onEnableChange(r.row)">
  50. <el-radio text-color="#48bb78" :label="1">营业</el-radio>
  51. <el-radio text-color="#f56565" :label="0">歇业</el-radio>
  52. </el-radio-group>
  53. </template>
  54. </el-table-column>
  55. <el-table-column label="是否值班打卡" width="160" align="center">
  56. <template slot-scope="r">
  57. <el-switch
  58. v-model="r.row.isDuty"
  59. :active-value="1"
  60. :inactive-value="0"
  61. @change="onEnableChange(r.row)"
  62. active-text="是"
  63. inactive-text="否">
  64. </el-switch>
  65. <!-- <el-radio-group-->
  66. <!-- :disabled="r.row.disabled"-->
  67. <!-- v-model="r.row.isEnable"-->
  68. <!-- @change="onEnableChange(r.row)">-->
  69. <!-- <el-radio text-color="#48bb78" :label="1">营业</el-radio>-->
  70. <!-- <el-radio text-color="#f56565" :label="0">歇业</el-radio>-->
  71. <!-- </el-radio-group>-->
  72. </template>
  73. </el-table-column>
  74. <el-table-column label="上班时间" width="120" align="center">
  75. <template slot-scope="r">
  76. <el-time-select
  77. style="width: 100%"
  78. size="mini"
  79. :picker-options="pickerOptions"
  80. :disabled="r.row.disabled || !r.row.isEnable"
  81. v-model="r.row.workTime"/>
  82. </template>
  83. </el-table-column>
  84. <el-table-column label="营业开始" width="120" align="center">
  85. <template slot-scope="r">
  86. <el-time-select
  87. style="width: 100%;"
  88. size="mini"
  89. :picker-options="pickerOptions"
  90. :disabled="r.row.disabled || !r.row.isEnable"
  91. v-model="r.row.openTime"/>
  92. </template>
  93. </el-table-column>
  94. <!-- <el-table-column label="午休开始">-->
  95. <!-- <template slot-scope="r">-->
  96. <!-- <el-time-select-->
  97. <!-- style="width: 100%"-->
  98. <!-- size="mini"-->
  99. <!-- :picker-options="pickerOptions"-->
  100. <!-- :disabled="r.row.disabled || !r.row.isEnable"-->
  101. <!-- v-model="r.row.noonbreakStart"/>-->
  102. <!-- </template>-->
  103. <!-- </el-table-column>-->
  104. <!-- <el-table-column label="午休结束">-->
  105. <!-- <template slot-scope="r">-->
  106. <!-- <el-time-select-->
  107. <!-- style="width: 100%"-->
  108. <!-- size="mini"-->
  109. <!-- :picker-options="pickerOptions"-->
  110. <!-- :disabled="r.row.disabled || !r.row.isEnable"-->
  111. <!-- v-model="r.row.noonbreakEnd"/>-->
  112. <!-- </template>-->
  113. <!-- </el-table-column>-->
  114. <el-table-column label="营业结束" width="120" align="center">
  115. <template slot-scope="r">
  116. <el-time-select
  117. style="width: 100%"
  118. size="mini"
  119. :picker-options="pickerOptions"
  120. :disabled="r.row.disabled || !r.row.isEnable"
  121. v-model="r.row.closeTime"/>
  122. </template>
  123. </el-table-column>
  124. <el-table-column label="下班时间" width="120" align="center">
  125. <template slot-scope="r">
  126. <el-time-select
  127. style="width: 100%"
  128. size="mini"
  129. :picker-options="pickerOptions"
  130. :disabled="r.row.disabled || !r.row.isEnable"
  131. v-model="r.row.workOffTime"/>
  132. </template>
  133. </el-table-column>
  134. <el-table-column label="操作列表" width="140" align="center">
  135. <template slot-scope="r">
  136. <btn-tip type="text" @click="deleteData(r.row,r.$index)">删除</btn-tip>
  137. <el-button type="text" @click="coppy(r.$index)">复制至全部</el-button>
  138. </template>
  139. </el-table-column>
  140. </el-table>
  141. </el-form-item>
  142. </el-form>
  143. <!-- </div>-->
  144. <div slot="footer" class="dialog-footer">
  145. <btn-tip tip="确定要提交吗?" type="primary" @click="onSubmit">保存</btn-tip>
  146. <el-button @click="handleClose">取消</el-button>
  147. </div>
  148. </DialogCom>
  149. </div>
  150. </template>
  151. <script>
  152. import OrgTreeSelect from '@/components/orgTreeSelect'
  153. import BtnTip from "@/components/btnTip";
  154. import dayjs from "dayjs";
  155. import {formatTime, timeCheck} from "@/utils/ruoyi";
  156. import {addWorkTimeDay} from "@/views/system/workTimeSet/api";
  157. import day from "@/components/Crontab/day";
  158. export default {
  159. components:{OrgTreeSelect,BtnTip},
  160. data() {
  161. return {
  162. selectTreeStrictly: true,
  163. isShow: false,
  164. workTimeList: [],
  165. orgIdList: [],
  166. nodes:[],
  167. startDatepickerOptions: {
  168. disabledDate(time) {
  169. const date = new Date();
  170. date.setTime(date.getTime()- 3600 * 1000 * 24 );
  171. return time.getTime() < date;
  172. },
  173. },
  174. };
  175. },
  176. props: {},
  177. watch: {
  178. },
  179. computed: {
  180. pickerOptions() {
  181. return {
  182. start: "00:00",
  183. end: "24:00",
  184. step: "00:05",
  185. };
  186. },
  187. },
  188. methods: {
  189. // queryNode(nodes){
  190. // console.log(JSON.parse(nodes),'nodes')
  191. // this.orgIdList = JSON.parse(nodes).map(v=>{return v.id});
  192. // },
  193. add(){
  194. this.isShow = true;
  195. },
  196. async refresh() {
  197. },
  198. reset() {
  199. return {
  200. workTimeList:[]
  201. };
  202. },
  203. addData(){
  204. //获取workTimeList最后一条数据
  205. let workTime = {
  206. isEnable: 1,
  207. workTime: '08:30',
  208. openTime: '09:00',
  209. // noonbreakStart: '12:00',
  210. // noonbreakEnd: '14:00',
  211. closeTime: '17:00',
  212. workOffTime: '17:30',
  213. isDuty:'0',
  214. ymdDate: new Date(),
  215. disabled: false,
  216. };
  217. if(this.workTimeList.length>0){
  218. if(this.workTimeList[this.workTimeList.length-1].ymdDate!=null){
  219. workTime.ymdDate = dayjs(this.workTimeList[this.workTimeList.length-1].ymdDate).add(1,'day').toDate()
  220. }
  221. }
  222. this.workTimeList.push(workTime);
  223. console.log("addData",this.workTimeList);
  224. },
  225. coppy(index){
  226. let workTime = this.workTimeList[index];
  227. for(let i=0;i<this.workTimeList.length;i++){
  228. this.workTimeList[i].isEnable = workTime.isEnable;
  229. // this.workTimeList[i].workTime = workTime.workTime;
  230. this.workTimeList[i].openTime = workTime.openTime;
  231. // this.workTimeList[i].noonbreakStart = workTime.noonbreakStart;
  232. // this.workTimeList[i].noonbreakEnd = workTime.noonbreakEnd;
  233. this.workTimeList[i].closeTime = workTime.closeTime;
  234. // this.workTimeList[i].workOffTime = workTime.workOffTime;
  235. }
  236. },
  237. deleteData(row,index){
  238. console.log(index);
  239. this.workTimeList.splice(index,1);
  240. },
  241. //检查每一项
  242. check(other) {
  243. if(!other.ymdDate){
  244. this.$message.error(`日期不能为空`);
  245. return;
  246. }
  247. const ds = this.formatTime(other.ymdDate,"YYYY-MM-DD");
  248. console.log(other,'ds')
  249. if ( !other.isEnable === null && !other.disabled ) {
  250. this.$message.error(`${ds}:未进行配置`);
  251. return;
  252. }
  253. if(other.isEnable){
  254. if(!other.openTime || !other.closeTime){
  255. this.$message.error(`${ds}:未配置时间`);
  256. return;
  257. }
  258. if(!timeCheck([other.openTime,other.closeTime])){
  259. this.$message.error(`${ds}:营业开始时间应在营业结束之前`);
  260. return false;
  261. }
  262. }
  263. //return true
  264. if (other.isEnable) {
  265. if (
  266. !(
  267. other.workTime &&
  268. other.openTime &&
  269. other.closeTime &&
  270. other.workOffTime
  271. )
  272. ) {
  273. this.$message.error(`${ds}:有尚未配置的时间项`);
  274. return;
  275. }
  276. // if (!other.noonbreakStart ^ !other.noonbreakEnd) {
  277. // this.$message.error(`午休开始及结束时间必须同时配置`);
  278. // return;
  279. // }
  280. if (
  281. !timeCheck([
  282. other.workTime,
  283. other.openTime,
  284. other.closeTime,
  285. other.workOffTime,
  286. ])
  287. ) {
  288. this.$message.error(
  289. `${ds}:请按照(上班时间<营业时间<营业结束<下班时间)顺序配置`
  290. );
  291. return false;
  292. }
  293. }
  294. return true;
  295. },
  296. handleClose() {
  297. this.isShow = false;
  298. this.workTimeList = [];
  299. this.orgIdList=[];
  300. this.$refs['orgTreeSelect'].clear();
  301. },
  302. onEnableChange(workTime) {
  303. if (!workTime.isEnable) {
  304. workTime.openTime = null;
  305. workTime.closeTime = null;
  306. // workTime.noonbreakStart = null;
  307. // workTime.noonbreakEnd = null;
  308. // workTime.workTime = null;
  309. // workTime.workOffTime = null;
  310. }
  311. },
  312. async onSubmit() {
  313. if(this.orgIdList.length === 0)return this.$message.error('请选择机构');
  314. if(this.workTimeList.length === 0)return this.$message.error('请添加日期');
  315. //判断是否有重复的日期
  316. let dateList = [];
  317. console.log(this.workTimeList,"this.workTimeList")
  318. // let workTimeList = JSON.parse(JSON.stringify(this.workTimeList))
  319. let workTimeList = this.workTimeList;
  320. for (let v of workTimeList) {
  321. if (v.ymdDate) {
  322. let date = this.formatTime(v.ymdDate,"YYYY-MM-DD");
  323. if (dateList.indexOf(date) > -1) {
  324. this.$message.error(`日期: ${date} 重复`);
  325. return;
  326. }
  327. dateList.push(date);
  328. }
  329. }
  330. // 校验
  331. for (let workTime of workTimeList) {
  332. const adjustedDate = new Date(workTime.ymdDate.getTime() + 8 * 60 * 60 * 1000);
  333. workTime.ymdDate=adjustedDate.toISOString().split("T")[0];
  334. if (!this.check(workTime)) {
  335. return;
  336. }
  337. }
  338. let data = {
  339. orgIdList:this.orgIdList,
  340. workTimeList:workTimeList
  341. }
  342. console.log(workTimeList,"workTimeList")
  343. addWorkTimeDay(data).then(res=>{
  344. this.$emit("ok");
  345. this.handleClose();
  346. })
  347. },
  348. },
  349. };
  350. </script>
  351. <style lang="scss" scoped>
  352. .question-infos {
  353. .el-form {
  354. padding-top: 10px;
  355. }
  356. }
  357. .el-rate {
  358. margin-top: 6px;
  359. }
  360. .change-icon {
  361. font-size: 18px;
  362. }
  363. </style>