check.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. <template>
  2. <!-- <el-dialog
  3. class="api-edit"
  4. v-model="showDialog"
  5. :title="`${formData.id ? '编辑批次' : '新增批次'}`"
  6. width="768px"
  7. :close-on-click-modal="false"
  8. :close-on-press-escape="false">
  9. <el-form ref="formRef" :model="formData" :rules="ruleForm" label-width="160px"> -->
  10. <div class="ota-edit-module-container">
  11. <el-dialog :title="'操作升级包'" v-model="isShowDialog" width="769px">
  12. <el-form :model="ruleForm" ref="formRef" :rules="rules" size="default" label-width="160px">
  13. <el-form-item label="类型" prop="formType" @change="getFormType">
  14. <el-radio-group v-model="ruleForm.types">
  15. <el-radio label="1">验证</el-radio>
  16. <el-radio label="2">升级</el-radio>
  17. </el-radio-group>
  18. </el-form-item>
  19. <el-form-item label="批次名称" prop="name">
  20. <el-input v-model="ruleForm.name" placeholder="请输入批次名称" />
  21. </el-form-item>
  22. <!-- <el-form-item label="待升级版本号" prop="waitVersion">-->
  23. <!-- <el-input v-model="ruleForm.waitVersion" placeholder="请输入待升级版本号" />-->
  24. <!-- </el-form-item>-->
  25. <el-form-item label="协议方式" prop="method">
  26. <el-radio-group v-model="ruleForm.method" @change="getMethod">
  27. <el-radio label="1">http</el-radio>
  28. <el-radio label="2">https</el-radio>
  29. <el-radio label="3">mqtt</el-radio>
  30. </el-radio-group>
  31. </el-form-item>
  32. <el-form-item label="所属设备" prop="devices" v-if="deviceShow">
  33. <!-- <el-select v-model="ruleForm.devices" filterable multiple placeholder="请选择设备" class="width100">-->
  34. <!-- <el-option v-for="item in productData" :key="item.id" :label="item.name" :value="item.id.toString()" />-->
  35. <!-- </el-select>-->
  36. <!-- 回显已选设备 -->
  37. <template v-if="deviceNameShow">
  38. <el-tag v-for="item in deviceNameList" style="margin-right: 10px;">{{ item }}</el-tag>
  39. </template>
  40. <el-button type="primary" @click="onOpenDevice()" style="margin-left: 5px; margin-top: 10px;">选择设备</el-button>
  41. </el-form-item>
  42. <el-form-item label="升级方式" prop="stratege">
  43. <el-radio-group v-model="ruleForm.stratege">
  44. <el-radio label="1" disabled>静态升级</el-radio>
  45. <el-radio label="2">动态升级</el-radio>
  46. </el-radio-group>
  47. </el-form-item>
  48. <el-form-item label="主动推送" prop="push">
  49. <el-radio-group v-model="ruleForm.push">
  50. <el-radio label="1" :disabled="ruleForm.pushDisabled">是</el-radio>
  51. <el-radio label="2">否</el-radio>
  52. </el-radio-group>
  53. </el-form-item>
  54. </el-form>
  55. <template #footer>
  56. <span class="dialog-footer">
  57. <el-button @click="onCancel" size="default">取 消</el-button>
  58. <el-button type="primary" @click="onSubmit" size="default">{{ruleForm.id!==0?'修 改':'添 加'}}</el-button>
  59. </span>
  60. </template>
  61. </el-dialog>
  62. <!-- 设备绑定弹窗 -->
  63. <DeviceBind ref="deviceRef" @bindSuccess="getDeviceTableData" />
  64. </div>
  65. </template>
  66. <script lang="ts">
  67. import { reactive, toRefs, defineComponent, onMounted, ref, unref} from 'vue';
  68. import { ElMessage } from 'element-plus';
  69. import api from '/@/api/ota';
  70. import rule from "/@/api/rule";
  71. import Device from "/@/views/iot/device/instance/index.vue";
  72. import DeviceBind from "/@/views/iot/ota-update/update/component/deviceBind.vue";
  73. interface RuleFormState {
  74. id: number;
  75. name: string;
  76. waitVersion: string;
  77. method: string;
  78. devices: Array;
  79. stratege: string;
  80. devOtaFirmwareId: number;
  81. push: string;
  82. pushDisabled: boolean,
  83. types: string;
  84. productId: string;
  85. }
  86. interface UpdateState {
  87. isShowDialog: boolean;
  88. ruleForm: RuleFormState;
  89. productData: [];
  90. rules: {};
  91. deviceShow: boolean;
  92. deviceNameShow: boolean;
  93. deviceNameList: [];
  94. }
  95. export default defineComponent({
  96. name: 'otaEditUpdateData',
  97. components: {DeviceBind},
  98. computed: {
  99. rule() {
  100. return rule
  101. }
  102. },
  103. setup(prop, { emit }) {
  104. const deviceRef = ref();
  105. const formRef = ref<HTMLElement | null>(null);
  106. const state = reactive<UpdateState>({
  107. isShowDialog: false,
  108. ruleForm: {
  109. id: 0,
  110. name: '',
  111. waitVersion: '',
  112. method: '1',
  113. devices: [],
  114. stratege: '2',
  115. devOtaFirmwareId: 0,
  116. push: '2',
  117. pushDisabled: true,
  118. types: '1',
  119. productId: '',
  120. },
  121. productData: [],
  122. rules: {
  123. name: [{ required: true, message: '批次名称不能为空', trigger: 'blur' }],
  124. method: [{ required: true, message: '协议方式不能为空', trigger: 'blur' }],
  125. stratege: [{ required: true, message: '升级方式不能为空', trigger: 'blur' }],
  126. push: [{ required: true, message: '推送方式不能为空', trigger: 'blur' }],
  127. types: [{ required: true, message: '类型不能为空', trigger: 'blur' }],
  128. },
  129. deviceShow: false, // 所属设备是否显示
  130. deviceNameShow: false, // 回显设备名称状态
  131. deviceNameList: [], // 回显设备名称
  132. });
  133. // 页面加载时
  134. onMounted(() => {
  135. // getProductList();
  136. getFormType();
  137. });
  138. // 获取操作升级包类型
  139. const getFormType = () => {
  140. // 如果是验证类型,设备信息必填项
  141. if (state.ruleForm.types === '1') {
  142. state.deviceShow = true;
  143. state.rules.devices = [{
  144. required: true,
  145. message: '所属设备不能为空',
  146. trigger: 'blur'
  147. }];
  148. } else { // 如果是升级类型,设备可选可不选
  149. delete (state.rules.devices);
  150. state.deviceShow = false;
  151. }
  152. };
  153. // 获取协议方式
  154. const getMethod = () => {
  155. // 如果是http、https协议则主动推送为否
  156. // if (state.ruleForm.method === '1') {
  157. state.ruleForm.push = '2';
  158. state.ruleForm.pushDisabled = true;
  159. // }
  160. // if (state.ruleForm.method === '2') {
  161. // state.ruleForm.push = '2';
  162. // state.ruleForm.pushDisabled = true;
  163. // }
  164. // if (state.ruleForm.method === '3'){
  165. // state.ruleForm.pushDisabled = false;
  166. // state.ruleForm.push = '1';
  167. // }
  168. };
  169. const getProductList = () => {
  170. api.batch.getDeviceList({ productId: state.ruleForm.productId}).then((res: any) => {
  171. state.productData = res.device
  172. })
  173. }
  174. // 打开弹窗
  175. const openDialog = (row: RuleFormState | null) => {
  176. resetForm();
  177. state.deviceNameList = [];
  178. state.deviceNameShow = false;
  179. if (row) {
  180. state.ruleForm.devOtaFirmwareId = row.id;
  181. state.ruleForm.productId = row.productId;
  182. }
  183. state.isShowDialog = true;
  184. if (state.ruleForm.types == '1') {
  185. state.deviceShow = true;
  186. }
  187. };
  188. const resetForm = () => {
  189. state.ruleForm = {
  190. id: 0,
  191. name: '',
  192. waitVersion: '',
  193. method: '1',
  194. devices: [],
  195. stratege: '2',
  196. devOtaFirmwareId: 0,
  197. push: '2',
  198. pushDisabled: true,
  199. types: '1',
  200. productId: '',
  201. };
  202. };
  203. // 关闭弹窗
  204. const closeDialog = () => {
  205. state.isShowDialog = false;
  206. state.deviceNameList = [];
  207. state.deviceNameShow = false;
  208. };
  209. // 取消
  210. const onCancel = () => {
  211. closeDialog();
  212. };
  213. // 新增
  214. const onSubmit = () => {
  215. const formWrap = unref(formRef) as any;
  216. if (!formWrap) return;
  217. formWrap.validate((valid: boolean) => {
  218. if (valid) {
  219. if (state.ruleForm.id !== 0) {
  220. //修改
  221. api.batch.edit(state.ruleForm).then(() => {
  222. ElMessage.success('升级包修改成功');
  223. closeDialog(); // 关闭弹窗
  224. emit('getList');
  225. });
  226. } else {
  227. //添加
  228. api.batch.add(state.ruleForm).then(() => {
  229. ElMessage.success('升级包添加成功');
  230. closeDialog(); // 关闭弹窗
  231. emit('getList');
  232. });
  233. }
  234. }
  235. });
  236. };
  237. // 获取设备列表
  238. const getDeviceTableData = (deviceIdList: any, deviceNameList: any) => {
  239. state.ruleForm.devices = deviceIdList;
  240. state.deviceNameList = deviceNameList;
  241. state.deviceNameShow = true;
  242. };
  243. // 打开设备列表
  244. const onOpenDevice = () => {
  245. deviceRef.value.openDialog(state.ruleForm.devices);
  246. };
  247. return {
  248. deviceRef,
  249. openDialog,
  250. closeDialog,
  251. onCancel,
  252. onSubmit,
  253. getMethod,
  254. getFormType,
  255. onOpenDevice,
  256. getDeviceTableData,
  257. formRef,
  258. ...toRefs(state),
  259. };
  260. },
  261. });
  262. // import { ref, reactive, nextTick } from 'vue'
  263. // import api from '/@/api/ota'
  264. // import { ruleRequired } from '/@/utils/validator'
  265. // import { ElMessage } from 'element-plus'
  266. // const emit = defineEmits(['getList'])
  267. // const showDialog = ref(false)
  268. // const formRef = ref()
  269. // const productData = ref([
  270. // {
  271. // id: '',
  272. // name: '',
  273. // },
  274. // ])
  275. // const baseForm = {
  276. // id: undefined,
  277. // method: '1',
  278. // push: '1',
  279. // name: '',
  280. // devices: '',
  281. // stratege: '1',
  282. // waitVersion: '',
  283. // devOtaFirmwareId: '',
  284. // productId:'',
  285. // }
  286. // const formData = reactive({
  287. // ...baseForm,
  288. // })
  289. // const ruleForm = {
  290. // method: [ruleRequired('请选择批次类型')],
  291. // name: [ruleRequired('批次名称不能为空')],
  292. // productId: [ruleRequired('请选择所属产品')],
  293. // devices: [ruleRequired('请选择批次模块')],
  294. // stratege: [ruleRequired('批次版本号不能为空')],
  295. // waitVersion: [ruleRequired('升级后版本号不能为空')],
  296. // }
  297. // const onSubmit = async () => {
  298. // await formRef.value.validate()
  299. // const theApi = formData.id ? api.batch.edit : api.batch.add
  300. // await theApi(formData)
  301. // ElMessage.success('操作成功')
  302. // resetForm()
  303. // showDialog.value = false
  304. // emit('getList')
  305. // }
  306. // const resetForm = async () => {
  307. // Object.assign(formData, { ...baseForm })
  308. // formRef.value && formRef.value.resetFields()
  309. // }
  310. // const open = async (row: any) => {
  311. // resetForm()
  312. // showDialog.value = true
  313. // nextTick(() => {
  314. // Object.assign(formData, { ...row })
  315. // getProductList()
  316. // })
  317. // }
  318. // defineExpose({ open })
  319. </script>
  320. <style lang="scss" scoped>
  321. .width100 {
  322. width: 100%;
  323. }
  324. </style>