shipCheckTemplateDetail.vue 7.1 KB

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