fireSafetyTemplateDetail.vue 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. <template>
  2. <div class="pt40 pl30" style="width: 600px">
  3. <el-form
  4. :model="ruleForm"
  5. :rules="rules"
  6. ref="ruleFormRef"
  7. label-width="140px"
  8. label-position="left"
  9. >
  10. <el-form-item class="mb30" prop="securityCheckName" label="安检名称">
  11. <el-input
  12. style="width: 280px"
  13. v-model="ruleForm.securityCheckName"
  14. ></el-input>
  15. </el-form-item>
  16. <el-form-item class="mb30" prop="securityCheckTarget" label="安检目标">
  17. <el-input
  18. style="width: 280px"
  19. v-model="ruleForm.securityCheckTarget"
  20. ></el-input>
  21. </el-form-item>
  22. <el-form-item class="mb30" prop="securityCheckFocus" label="排查重点">
  23. <el-input
  24. style="width: 280px"
  25. v-model="ruleForm.securityCheckFocus"
  26. ></el-input>
  27. </el-form-item>
  28. <el-form-item class="mb30" prop="shipLength" label="选择适用船长">
  29. <div class="df aic" style="width: 100%">
  30. <el-input
  31. style="width: 130px"
  32. v-model="ruleForm.minShipLen"
  33. :disabled="ruleForm.isAllShip === 1"
  34. ></el-input>
  35. <div class="mr10 ml10">-</div>
  36. <el-input
  37. style="width: 130px"
  38. v-model="ruleForm.maxShipLen"
  39. :disabled="ruleForm.isAllShip === 1"
  40. ></el-input>
  41. <el-checkbox
  42. class="ml20"
  43. v-model="ruleForm.isAllShip"
  44. label="所有船舶"
  45. size="large"
  46. :true-value="1"
  47. :false-value="0"
  48. :true-label="1"
  49. :false-label="0"
  50. />
  51. </div>
  52. </el-form-item>
  53. <div class="df aic jcsb mb20 mt50">
  54. <el-button class="mr30" type="primary" @click="addNewItem">
  55. 添加新检查项目
  56. </el-button>
  57. <el-button-group v-show="ruleForm.items.length > 1">
  58. <el-button
  59. v-for="(item, index) in ruleForm.items"
  60. @click="itemIndex = index"
  61. :type="itemIndex == index ? 'primary' : ''"
  62. >
  63. {{ item.checkItemName || "新检查项目" }}
  64. </el-button>
  65. </el-button-group>
  66. </div>
  67. <el-form-item class="mb30" label="项目名称" prop="checkItemName">
  68. <el-input
  69. style="width: 280px"
  70. v-model="ruleForm.items[itemIndex].checkItemName"
  71. ></el-input>
  72. </el-form-item>
  73. <el-form-item class="mb30" label="项目类型" prop="checkItemTypeName">
  74. <el-select
  75. style="width: 280px"
  76. v-model="ruleForm.items[itemIndex].checkItemTypeName"
  77. value-key="checkItemTypeName"
  78. placeholder="请选择安全检查项目类型"
  79. @change="selectChange"
  80. >
  81. <el-option
  82. v-for="item in templateTypeSelect"
  83. :label="item.value"
  84. :value="item"
  85. />
  86. </el-select>
  87. </el-form-item>
  88. <el-form-item class="mb30" label="项目备注" prop="checkItemRemark">
  89. <el-input
  90. style="width: 280px"
  91. v-model="ruleForm.items[itemIndex].checkItemRemark"
  92. ></el-input>
  93. </el-form-item>
  94. <div class="df jcfe">
  95. <el-button
  96. v-show="ruleForm.items.length > 1"
  97. size="small"
  98. type="primary"
  99. @click="removeItem"
  100. >
  101. 移除当前项目
  102. </el-button>
  103. </div>
  104. </el-form>
  105. <div class="dialog-footer df aic jcfe">
  106. <el-button @click="resetForm">重置</el-button>
  107. <el-button type="primary" @click="addFireSafetyTemplate(ruleForm)">
  108. 确定
  109. </el-button>
  110. </div>
  111. </div>
  112. </template>
  113. <script setup>
  114. import { ref, h, reactive, toRefs, onMounted } from "vue";
  115. import { ElNotification, ElMessageBox, ElMessage } from "element-plus";
  116. import store from "../../store";
  117. import router from "../../router";
  118. import md5 from "md5";
  119. import api from "../../apis/fetch";
  120. import { useRoute } from "vue-router";
  121. import _ from "lodash";
  122. import { subTimeStr } from "../../utils/utils";
  123. const route = useRoute();
  124. async function getFireSafetyTemplateDetail(id) {
  125. let { data } = await api.getFireSafetyTemplateDetail({
  126. id,
  127. });
  128. if (data.status == 0) {
  129. ruleForm.value = data.result;
  130. }
  131. }
  132. let ruleFormRef = ref(null);
  133. let ruleForm = ref({
  134. securityCheckName: "",
  135. items: [{}],
  136. minShipLen: "",
  137. maxShipLen: "",
  138. isAllShip: 0,
  139. });
  140. async function resetForm() {
  141. itemIndex.value = 0;
  142. ruleForm.value = {
  143. items: [{}],
  144. };
  145. if (route.query.id) getFireSafetyTemplateDetail(route.query.id);
  146. }
  147. const checkShipLength = (rule, value, callback) => {
  148. if (
  149. (!ruleForm.value.minShipLen || !ruleForm.value.maxShipLen) &&
  150. ruleForm.value.isAllShip === 0
  151. ) {
  152. callback(new Error("请完善适用船长"));
  153. } else {
  154. callback();
  155. }
  156. };
  157. const checkItemName = (rule, value, callback) => {
  158. if (
  159. !ruleForm.value.items.every((item, index) => {
  160. if (!item.checkItemName)
  161. callback(new Error(`请完善第${index + 1}个项目名称`));
  162. return !!item.checkItemName;
  163. })
  164. ) {
  165. } else {
  166. callback();
  167. }
  168. };
  169. const checkItemTypeName = (rule, value, callback) => {
  170. if (
  171. !ruleForm.value.items.every((item, index) => {
  172. if (!item.checkItemTypeName)
  173. callback(new Error(`请完善第${index + 1}个项目类型`));
  174. return !!item.checkItemTypeName;
  175. })
  176. ) {
  177. } else {
  178. callback();
  179. }
  180. };
  181. const checkItemRemark = (rule, value, callback) => {
  182. if (
  183. !ruleForm.value.items.every((item, index) => {
  184. if (!item.checkItemRemark)
  185. callback(new Error(`请完善第${index + 1}个项目备注`));
  186. return !!item.checkItemRemark;
  187. })
  188. ) {
  189. } else {
  190. callback();
  191. }
  192. };
  193. const rules = ref({
  194. securityCheckName: [
  195. { required: true, message: "请填写安检名称", trigger: "blur" },
  196. ],
  197. securityCheckTarget: [
  198. { required: true, message: "请填写安检目标", trigger: "blur" },
  199. ],
  200. securityCheckFocus: [
  201. { required: true, message: "请填写安检重点", trigger: "blur" },
  202. ],
  203. shipLength: [{ validator: checkShipLength, trigger: "blur" }],
  204. checkItemName: [{ validator: checkItemName, trigger: "blur" }],
  205. checkItemTypeName: [{ validator: checkItemTypeName, trigger: "blur" }],
  206. checkItemRemark: [{ validator: checkItemRemark, trigger: "blur" }],
  207. });
  208. let itemIndex = ref(0);
  209. let templateTypeSelect = ref([]);
  210. function addNewItem() {
  211. ruleForm.value.items.push({});
  212. itemIndex.value = ruleForm.value.items.length - 1;
  213. }
  214. async function getFireSafetyTemplateTypeSelect() {
  215. let { data } = await api.getFireSafetyTemplateTypeSelect();
  216. templateTypeSelect.value = data.status == 0 ? data.result : [];
  217. }
  218. async function addFireSafetyTemplate() {
  219. ruleFormRef.value.validate(async (valid) => {
  220. if (valid) {
  221. let {
  222. securityCheckName,
  223. minShipLen,
  224. maxShipLen,
  225. items,
  226. id,
  227. securityCheckTarget,
  228. securityCheckFocus,
  229. isAllShip,
  230. } = ruleForm.value;
  231. let postData = {
  232. securityCheckName,
  233. minShipLen,
  234. maxShipLen,
  235. items,
  236. id,
  237. securityCheckTarget,
  238. securityCheckFocus,
  239. isAllShip,
  240. };
  241. const loading = ElLoading.service({
  242. lock: true,
  243. text: "正在提交...",
  244. background: "rgba(0, 0, 0, 0.7)",
  245. });
  246. let res = await api[
  247. id ? "updateFireSafetyTemplate" : "addFireSafetyTemplate"
  248. ](postData);
  249. loading.close();
  250. if (res.data.status == 0) {
  251. ElNotification.success({
  252. title: id ? "更新成功" : "添加成功",
  253. duration: 1500,
  254. message: `${securityCheckName}:${res.data.msg}`,
  255. type: "success",
  256. });
  257. router.replace("/fireSafetyManage/fireSafetyTemplateList");
  258. } else {
  259. ElNotification.error({
  260. title: "失败",
  261. duration: 2000,
  262. message: res.data.msg,
  263. });
  264. }
  265. } else {
  266. return false;
  267. }
  268. });
  269. }
  270. function removeItem() {
  271. ruleForm.value.items.splice(itemIndex.value, 1);
  272. itemIndex.value = itemIndex.value == 0 ? 0 : itemIndex.value - 1;
  273. }
  274. function selectChange(e) {
  275. ruleForm.value.items[itemIndex.value].checkItemTypeId = e.key;
  276. ruleForm.value.items[itemIndex.value].checkItemTypeName = e.value;
  277. }
  278. onMounted(() => {
  279. if (route.query.id) getFireSafetyTemplateDetail(route.query.id);
  280. getFireSafetyTemplateTypeSelect();
  281. });
  282. </script>
  283. <style scoped>
  284. .dialog-footer {
  285. margin-top: 100px;
  286. }
  287. </style>