dialog.add.vue 11 KB

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