rule-cycle.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  1. <template>
  2. <div>
  3. <el-row :gutter="8" v-if="pageType">
  4. <el-col :span="2">
  5. <!-- @input="
  6. (value) =>
  7. (formData.cycleValue = value.replace(/^(0+)|[^\d]+/g, ''))
  8. " -->
  9. <el-input
  10. class="cycle_value"
  11. size="small"
  12. v-model.number="formData.cycleValue"
  13. @change="cycleValueChange"
  14. placeholder="请输入"
  15. :disabled="isBindPlan"
  16. ></el-input>
  17. </el-col>
  18. <el-col :span="3">
  19. <el-select
  20. v-model="formData.cycleType"
  21. size="small"
  22. @change="handleCycleTypeChange"
  23. :disabled="isBindPlan"
  24. >
  25. <el-option
  26. v-for="item in cycleOpt"
  27. :key="item.code"
  28. :label="item.label"
  29. :value="item.code"
  30. ></el-option>
  31. </el-select>
  32. </el-col>
  33. <el-col :span="8" v-if="[1, 2, 4, 5].includes(formData.cycleType)">
  34. <div
  35. v-for="(item, index) in ruleCycleList"
  36. :key="index"
  37. class="cycle01_box"
  38. >
  39. <el-input
  40. v-model.number="item.month"
  41. size="small"
  42. oninput="value = value.replace(/^(0+)|[^\d]+/g,'')"
  43. @input="(e) => inputMonth(e, index)"
  44. v-if="[5].includes(formData.cycleType)"
  45. :disabled="isBindPlan"
  46. >
  47. <template #suffix>月</template>
  48. </el-input>
  49. <el-input
  50. v-model.number="item.day"
  51. size="small"
  52. oninput="value = value.replace(/^(0+)|[^\d]+/g,'')"
  53. @input="(e) => inputDay(e, index)"
  54. v-if="[4, 5].includes(formData.cycleType)"
  55. :disabled="isBindPlan"
  56. >
  57. <template #suffix>日</template>
  58. </el-input>
  59. <el-input
  60. v-model.number="item.hour"
  61. size="small"
  62. oninput="value = value.replace(/^0+(\d)|[^\d]+/g,'')"
  63. @input="(e) => inputHour(e, index)"
  64. v-if="[2, 4, 5].includes(formData.cycleType)"
  65. :disabled="isBindPlan"
  66. >
  67. <template #suffix>时</template>
  68. </el-input>
  69. <el-input
  70. v-model.number="item.minute"
  71. size="small"
  72. oninput="value = value.replace(/^0+(\d)|[^\d]+/g,'')"
  73. @input="(e) => inputMinute(e, index)"
  74. :disabled="isBindPlan"
  75. >
  76. <template #suffix>分</template>
  77. </el-input>
  78. </div>
  79. </el-col>
  80. </el-row>
  81. <el-row v-else>
  82. <el-col :span="24" class="cycle_time_column">
  83. <span style="margin-right: 20px"
  84. >{{ formData.cycleValue }}{{ cycleOptObj[formData.cycleType] }}</span
  85. >
  86. <div v-if="[1, 2, 4, 5].includes(formData.cycleType)">
  87. <span v-if="[5].includes(formData.cycleType)"
  88. >{{ ruleCycleList[0].month }}月</span
  89. >
  90. <span v-if="[4, 5].includes(formData.cycleType)"
  91. >{{ ruleCycleList[0].day }}日</span
  92. >
  93. <span v-if="[2, 4, 5].includes(formData.cycleType)"
  94. >{{ ruleCycleList[0].hour }}时</span
  95. >
  96. <span>{{ ruleCycleList[0].minute }}分</span>
  97. </div>
  98. </el-col>
  99. </el-row>
  100. <!-- 根据周期类型展示时间组件 11,12,13,14 -->
  101. <div>
  102. <!-- 次/天 -->
  103. <el-row :gutter="20" v-if="formData.cycleType === 11">
  104. <el-col
  105. v-for="(item, index) in ruleCycleList"
  106. :key="index"
  107. :span="6"
  108. class="cycle_item"
  109. >
  110. <span>第{{ index + 1 }}次</span>
  111. <div class="cycle_sub_item" v-if="pageType">
  112. <el-input
  113. v-model.number="item.hour"
  114. size="small"
  115. placeholder="时"
  116. oninput="value = value.replace(/^0+(\d)|[^\d]+/g,'')"
  117. @input="(e) => inputHour(e, index)"
  118. :disabled="isBindPlan"
  119. >
  120. <template #suffix>时</template>
  121. </el-input>
  122. </div>
  123. <div v-else>{{ item.hour }}时</div>
  124. <div class="cycle_sub_item" v-if="pageType">
  125. <el-input
  126. v-model.number="item.minute"
  127. size="small"
  128. oninput="value = value.replace(/^0+(\d)|[^\d]+/g,'')"
  129. @input="(e) => inputMinute(e, index)"
  130. placeholder="分"
  131. :disabled="isBindPlan"
  132. >
  133. <template #suffix>分</template>
  134. </el-input>
  135. </div>
  136. <div v-else>
  137. {{ item.minute > 9 ? item.minute : '0' + item.minute }}分
  138. </div>
  139. </el-col>
  140. </el-row>
  141. <!-- 次/周 -->
  142. <el-row :gutter="20" v-else-if="formData.cycleType === 12">
  143. <el-col
  144. v-for="(item, index) in ruleCycleList"
  145. :key="index"
  146. :span="6"
  147. class="cycle_item"
  148. >
  149. <span>第{{ index + 1 }}次</span>
  150. <div class="cycle_sub_item" v-if="pageType">
  151. <el-select
  152. v-model.number="item.week"
  153. size="small"
  154. placeholder="周"
  155. :disabled="isBindPlan"
  156. >
  157. <el-option
  158. v-for="item in weekList"
  159. :key="item.value"
  160. :value="item.value"
  161. :label="item.label"
  162. ></el-option> </el-select
  163. >周
  164. </div>
  165. <div v-else>{{ item.week }}</div>
  166. <div class="cycle_sub_item" v-if="pageType">
  167. <el-input
  168. v-model.number="item.hour"
  169. size="small"
  170. placeholder="时"
  171. oninput="value = value.replace(/^0+(\d)|[^\d]+/g,'')"
  172. @input="(e) => inputHour(e, index)"
  173. :disabled="isBindPlan"
  174. >
  175. <template #suffix>时</template>
  176. </el-input>
  177. </div>
  178. <div v-else>{{ item.hour }}时</div>
  179. </el-col>
  180. </el-row>
  181. <!-- 次/月 -->
  182. <el-row :gutter="20" v-else-if="formData.cycleType === 13">
  183. <el-col
  184. v-for="(item, index) in ruleCycleList"
  185. :key="index"
  186. :span="6"
  187. class="cycle_item"
  188. >
  189. <span>第{{ index + 1 }}次</span>
  190. <div class="cycle_sub_item" v-if="pageType">
  191. <el-input
  192. v-model.number="item.day"
  193. size="small"
  194. placeholder="日"
  195. oninput="value = value.replace(/^(0+)|[^\d]+/g,'')"
  196. @input="(e) => inputDay(e, index)"
  197. :disabled="isBindPlan"
  198. >
  199. <template #suffix>日</template>
  200. </el-input>
  201. </div>
  202. <div v-else>{{ item.day }}日</div>
  203. <div class="cycle_sub_item" v-if="pageType">
  204. <el-input
  205. v-model.number="item.hour"
  206. size="small"
  207. placeholder="时"
  208. oninput="value = value.replace(/^0+(\d)|[^\d]+/g,'')"
  209. @input="(e) => inputHour(e, index)"
  210. :disabled="isBindPlan"
  211. >
  212. <template #suffix>时</template>
  213. </el-input>
  214. </div>
  215. <div v-else>{{ item.hour }}</div>
  216. </el-col>
  217. </el-row>
  218. <!-- 次/年 -->
  219. <el-row :gutter="20" v-else-if="formData.cycleType === 14">
  220. <el-col
  221. v-for="(item, index) in ruleCycleList"
  222. :key="index"
  223. :span="6"
  224. class="cycle_item"
  225. >
  226. <span>第{{ index + 1 }}次</span>
  227. <div class="cycle_sub_item" v-if="pageType">
  228. <el-input
  229. v-model.number="item.month"
  230. size="small"
  231. placeholder="月"
  232. oninput="value = value.replace(/^(0+)|[^\d]+/g,'')"
  233. @input="(e) => inputMonth(e, index)"
  234. :disabled="isBindPlan"
  235. >
  236. <template #suffix>月</template>
  237. </el-input>
  238. </div>
  239. <div v-else>{{ item.month }}月</div>
  240. <div class="cycle_sub_item" v-if="pageType">
  241. <el-input
  242. v-model.number="item.day"
  243. size="small"
  244. placeholder="日"
  245. oninput="value = value.replace(/^(0+)|[^\d]+/g,'')"
  246. @input="(e) => inputDay(e, index)"
  247. :disabled="isBindPlan"
  248. >
  249. <template #suffix>日</template>
  250. </el-input>
  251. </div>
  252. <div v-else>{{ item.day }}日</div>
  253. <div class="cycle_sub_item" v-if="pageType">
  254. <el-input
  255. v-model.number="item.hour"
  256. size="small"
  257. placeholder="时"
  258. oninput="value = value.replace(/^0+(\d)|[^\d]+/g,'')"
  259. @input="(e) => inputHour(e, index)"
  260. :disabled="isBindPlan"
  261. >
  262. <template #suffix>时</template>
  263. </el-input>
  264. </div>
  265. <div v-else>{{ item.hour }}时</div>
  266. </el-col>
  267. </el-row>
  268. </div>
  269. </div>
  270. </template>
  271. <script>
  272. export default {
  273. props: {
  274. formData: {
  275. type: Object,
  276. default: () => {
  277. return {};
  278. }
  279. },
  280. // 编辑edit和新增add
  281. pageType: {
  282. type: String,
  283. default: ''
  284. },
  285. isBindPlan: {
  286. type: Boolean,
  287. default: () => {
  288. return false;
  289. }
  290. }
  291. },
  292. data() {
  293. return {
  294. ruleCycleList: [
  295. // {
  296. // year: '', // 周期年
  297. // month: '', // 周期月
  298. // week: '', // 周期周
  299. // day: '', // 周期日
  300. // hour: '', // 周期时
  301. // minute: '', // 周期分
  302. // second: '' // 周期秒
  303. // }
  304. ],
  305. weekList: [
  306. { value: 1, label: '周一' },
  307. { value: 2, label: '周二' },
  308. { value: 3, label: '周三' },
  309. { value: 4, label: '周四' },
  310. { value: 5, label: '周五' },
  311. { value: 6, label: '周六' },
  312. { value: 7, label: '周日' }
  313. ],
  314. cycleOptObj: {
  315. 1: '时/次',
  316. 2: '天/次',
  317. //3: '周/次',
  318. 4: '月/次',
  319. 5: '年/次',
  320. 11: '次/天',
  321. //12: '次/周',
  322. 13: '次/月',
  323. 14: '次/年'
  324. },
  325. cycleOpt: [
  326. { code: 1, label: '时/次' },
  327. { code: 2, label: '天/次' },
  328. //{ code: 3, label: '周/次' },
  329. { code: 4, label: '月/次' },
  330. { code: 5, label: '年/次' },
  331. { code: 11, label: '次/天' },
  332. //{ code: 12, label: '次/周' },
  333. { code: 13, label: '次/月' },
  334. { code: 14, label: '次/年' }
  335. ]
  336. };
  337. },
  338. watch: {
  339. formData(val) {
  340. console.log(val.cycle);
  341. if (val.cycle) {
  342. this.ruleCycleList = val.cycle;
  343. }
  344. }
  345. },
  346. methods: {
  347. // 巡点检周期输入数量
  348. cycleValueChange(val) {
  349. console.log(val);
  350. console.log(this.formData.cycleType);
  351. const cycleType01 = [1, 2, 4, 5];
  352. const cycleType02 = [11, 13, 14];
  353. this.ruleCycleList = [];
  354. // 次在后
  355. console.log(cycleType01.includes(this.formData.cycleType));
  356. if (cycleType01.includes(this.formData.cycleType)) {
  357. this.ruleCycleList.push({
  358. month: 1, // 周期月
  359. day: 1, // 周期日
  360. hour: 0, // 周期时
  361. minute: 0 // 周期分
  362. });
  363. console.log(this.ruleCycleList);
  364. }
  365. // 次在前
  366. if (cycleType02.includes(this.formData.cycleType)) {
  367. for (let i = 0; i < val; i++) {
  368. this.ruleCycleList.push({
  369. month: 1, // 周期月
  370. day: 1, // 周期日
  371. hour: 0, // 周期时
  372. minute: 0 // 周期分
  373. });
  374. }
  375. }
  376. // 时/次
  377. if (this.formData.cycleType === 1) {
  378. this.ruleCycleList.forEach((item) => {
  379. delete item.month;
  380. delete item.day;
  381. delete item.hour;
  382. });
  383. }
  384. console.log(this.ruleCycleList);
  385. // 天/次、次/天
  386. if ([2, 11].includes(this.formData.cycleType)) {
  387. this.ruleCycleList.forEach((item) => {
  388. delete item.month;
  389. delete item.day;
  390. });
  391. }
  392. // 月/次、次/月
  393. if ([4, 13].includes(this.formData.cycleType)) {
  394. this.ruleCycleList.forEach((item) => {
  395. delete item.month;
  396. });
  397. }
  398. },
  399. // 周期类型选择
  400. handleCycleTypeChange() {
  401. this.cycleValueChange(this.formData.cycleValue);
  402. },
  403. // 输入月
  404. inputMonth(e, index) {
  405. if (e > 12) {
  406. this.ruleCycleList[index].month = 1;
  407. return this.$message.warning('月份最大值为12月');
  408. }
  409. },
  410. // 输入日
  411. inputDay(e, index) {
  412. if (e > 31) {
  413. this.ruleCycleList[index].day = 1;
  414. return this.$message.warning('日期最大值为31日');
  415. }
  416. },
  417. // 输入时
  418. inputHour(e, index) {
  419. if (e > 23) {
  420. this.ruleCycleList[index].hour = 0;
  421. return this.$message.warning('时间最大值为23时');
  422. }
  423. },
  424. // 输入时
  425. inputMinute(e, index) {
  426. if (e > 59) {
  427. this.ruleCycleList[index].minute = 0;
  428. return this.$message.warning('分钟最大值为59分');
  429. }
  430. }
  431. }
  432. };
  433. </script>
  434. <style lang="scss" scoped>
  435. .cycle_item {
  436. display: flex;
  437. align-items: center;
  438. color: #666;
  439. > span {
  440. width: 50px;
  441. }
  442. .cycle_sub_item {
  443. flex: 1;
  444. display: flex;
  445. align-items: center;
  446. }
  447. }
  448. .cycle01_box {
  449. display: flex;
  450. ::v-deep .el-input {
  451. width: 80px;
  452. }
  453. }
  454. .cycle_time_column {
  455. display: flex;
  456. }
  457. </style>