rule-cycle.vue 14 KB

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