|
|
@@ -0,0 +1,276 @@
|
|
|
+<template>
|
|
|
+ <view class="content">
|
|
|
+ <up-form :model="form" labelWidth="70" ref="uFormRef">
|
|
|
+ <block v-if="workpresetjson.questionedit != 0 && workpresetjson.questionoption">
|
|
|
+ <up-form-item label="故障类型" prop="itemtype" :required="workpresetjson.questionedit == 11">
|
|
|
+ <view class="options-box">
|
|
|
+ <view class="option" :class="form.itemtype == item.value ? 'active' : ''"
|
|
|
+ v-for="item in questionoption" :key="item.value"
|
|
|
+ @click="clickRadio(item.value, 'itemtype')">
|
|
|
+ {{ item.value }}
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </up-form-item>
|
|
|
+ <up-form-item label="问题编辑" prop="questionedit" :required="workpresetjson.questionedit == 11">
|
|
|
+ <up-textarea v-model="form.questionedit" placeholder="问题编辑" autoHeight height="20" />
|
|
|
+ </up-form-item>
|
|
|
+ </block>
|
|
|
+
|
|
|
+
|
|
|
+ <up-form-item v-if="workpresetjson.passcheck != 0" label="合格确认" prop="passcheck"
|
|
|
+ :required="workpresetjson.passcheck == 11">
|
|
|
+ <view class="options-box">
|
|
|
+ <view class="option" :class="form.passcheck == item.value ? 'active' : ''" v-for="item in [
|
|
|
+ { value: '正常' },
|
|
|
+ { value: '异常' }]" :key="item.value" @click="clickRadio(item.value, 'passcheck')">
|
|
|
+ {{ item.value }}
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </up-form-item>
|
|
|
+
|
|
|
+ <view v-if="workpresetjson.additem != 0">
|
|
|
+ <up-form-item label="是否更换配件" prop="additem" :required="workpresetjson.additem == 11">
|
|
|
+ <view class="options-box">
|
|
|
+ <view class="option" :class="form.additem == item.value ? 'active' : ''" v-for="item in [
|
|
|
+ { value: '否' },
|
|
|
+ { value: '是' }]" :key="item.value" @click="clickRadio(item.value, 'additem')">
|
|
|
+ {{ item.value }}
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </up-form-item>
|
|
|
+ <view v-if="form.additem == '是'">
|
|
|
+ 需要更换配件
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+
|
|
|
+ <up-form-item v-if="workpresetjson.confirm != 0" label="确认信息" prop="confirm"
|
|
|
+ :required="workpresetjson.confirm == 11">
|
|
|
+ <view class="options-box">
|
|
|
+ <view class="option" :class="form.confirm == item ? 'active' : ''"
|
|
|
+ v-for="(item) in workpresetjson.confirm_options" :key="item"
|
|
|
+ @click="clickRadio(item, 'confirm')">
|
|
|
+ {{ item }}
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </up-form-item>
|
|
|
+
|
|
|
+ <up-form-item v-if="workpresetjson.amountpay != 0" label="费用支付" prop="amountpay"
|
|
|
+ :required="workpresetjson.amountpay == 11">
|
|
|
+ <up-input v-model="form.amountpay" type="number" placeholder="费用支付">
|
|
|
+ <template #suffix>
|
|
|
+ 元
|
|
|
+ </template>
|
|
|
+ </up-input>
|
|
|
+ </up-form-item>
|
|
|
+
|
|
|
+ <up-form-item v-if="workpresetjson.fileupload != 0" label="拍照" prop="fileupload"
|
|
|
+ :required="rules.fileupload[0].required">
|
|
|
+ <My_upload ref="upload" :fileList="data.attinfos" @uploadCallback="uploadCallback" />
|
|
|
+ </up-form-item>
|
|
|
+
|
|
|
+ <up-form-item v-if="workpresetjson.textedit != 0" label="文字说明" prop="textedit"
|
|
|
+ :required="rules.textedit[0].required">
|
|
|
+ <up-textarea v-model="form.textedit" placeholder="文字说明" autoHeight height="20" />
|
|
|
+ </up-form-item>
|
|
|
+
|
|
|
+ </up-form>
|
|
|
+
|
|
|
+ <view style="padding-bottom: 50px;width: 350rpx;margin: 40rpx auto 0;" @click="save">
|
|
|
+ <My-button text="保存" :loading="loading" />
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup>
|
|
|
+import { ref, reactive, getCurrentInstance } from 'vue';
|
|
|
+const { $Http } = getCurrentInstance().proxy;
|
|
|
+const uFormRef = ref(null);
|
|
|
+
|
|
|
+const upload = ref(null);
|
|
|
+
|
|
|
+import { onLoad } from '@dcloudio/uni-app';
|
|
|
+const form = reactive({
|
|
|
+ textedit: '', // 上传文本
|
|
|
+ confirm: "", // 确认信息
|
|
|
+ itemtype: "", // 故障类型
|
|
|
+ questionedit: "", // 问题编辑
|
|
|
+ additem: "", // 是否更换配件
|
|
|
+ passcheck: "", //合格确认 异常时 文字和图片必填
|
|
|
+ amountpay: "", // 费用支付
|
|
|
+ fileupload: "", // 上传图片
|
|
|
+});
|
|
|
+let data = {
|
|
|
+ attinfos: []
|
|
|
+};
|
|
|
+let workpresetjson = reactive({});
|
|
|
+
|
|
|
+let rules = reactive({
|
|
|
+ textedit: [
|
|
|
+ { required: false, message: '请输入说明', trigger: 'blur' }
|
|
|
+ ],
|
|
|
+ fileupload: [
|
|
|
+ { required: false, message: '请上传图片', trigger: 'change' }
|
|
|
+ ],
|
|
|
+});
|
|
|
+const questionoption = ref([]);
|
|
|
+
|
|
|
+onLoad(() => {
|
|
|
+ console.log("$Http.data", $Http.data)
|
|
|
+ data = reactive($Http.data);
|
|
|
+ delete $Http.data;
|
|
|
+
|
|
|
+ wx.setNavigationBarTitle({
|
|
|
+ title: data.title,
|
|
|
+ })
|
|
|
+
|
|
|
+ workpresetjson = Object.assign(workpresetjson, data.workpresetjson);
|
|
|
+
|
|
|
+ rules = Object.assign(rules, {
|
|
|
+ textedit: [
|
|
|
+ { required: workpresetjson.textedit == 11, message: '请输入说明', trigger: 'blur' },
|
|
|
+ { min: 2, max: 500, message: '长度在 2 到 500 个字符', trigger: 'blur' }
|
|
|
+ ],
|
|
|
+ confirm: [
|
|
|
+ { required: workpresetjson.confirm == 11, message: '请选择确认信息', trigger: 'change' }
|
|
|
+ ],
|
|
|
+ itemtype: [
|
|
|
+ { required: workpresetjson.questionedit == 11, message: '请选择故障类型', trigger: 'change' }
|
|
|
+ ],
|
|
|
+ questionedit: [
|
|
|
+ { required: workpresetjson.questionedit == 11, message: '请输入问题编辑', trigger: 'blur' },
|
|
|
+ { min: 2, max: 500, message: '长度在 2 到 500 个字符', trigger: 'blur' }
|
|
|
+ ],
|
|
|
+ additem: [
|
|
|
+ { required: workpresetjson.additem == 11, message: '请选择是否更换配件', trigger: 'change' }
|
|
|
+ ],
|
|
|
+ passcheck: [
|
|
|
+ { required: workpresetjson.passcheck == 11, message: '请选择合格确认', trigger: 'change' }
|
|
|
+ ],
|
|
|
+ amountpay: [
|
|
|
+ { required: workpresetjson.amountpay == 11, message: '请输入费用支付', trigger: 'blur' },
|
|
|
+ { pattern: /^\d+(\.\d{1,2})?$/, message: '请输入正确的金额', trigger: 'blur' }
|
|
|
+ ],
|
|
|
+ fileupload: [
|
|
|
+ { required: workpresetjson.fileupload == 11, message: '请上传图片', trigger: 'change' }
|
|
|
+ ],
|
|
|
+ })
|
|
|
+ setTimeout(() => {
|
|
|
+ uFormRef.value.setRules(rules);
|
|
|
+ });
|
|
|
+
|
|
|
+ if (workpresetjson.questionoption) $Http.getClass(workpresetjson.questionoption).then(res => {
|
|
|
+ questionoption.value = res.data;
|
|
|
+ if (res.code !== 1) return uni.showToast({ title: res.msg, icon: 'none' });
|
|
|
+ });
|
|
|
+});
|
|
|
+
|
|
|
+// 保存
|
|
|
+let loading = ref(false);
|
|
|
+
|
|
|
+function save() {
|
|
|
+ if (loading.value) return;
|
|
|
+ if (upload.value.isUploading()) return;
|
|
|
+ uFormRef.value.validate().then(valid => {
|
|
|
+ if (valid) {
|
|
|
+ console.log("data", data)
|
|
|
+ return console.log(form);
|
|
|
+ let content = {
|
|
|
+ "sa_workorderid": data.sa_workorderid,
|
|
|
+ "sa_workorder_nodeid": data.sa_workorder_nodeid,
|
|
|
+ ...form
|
|
|
+ };
|
|
|
+ loading.value = true;
|
|
|
+ $Http.basic({
|
|
|
+ "id": "20230208140003",
|
|
|
+ content
|
|
|
+ }).then(res => {
|
|
|
+ loading.value = false;
|
|
|
+ console.log("保存工单", res);
|
|
|
+ uni.showToast({ title: res.code !== 1 ? res.msg : "保存成功", icon: 'none', mask: res.code == 1 });
|
|
|
+ if (res.code == 1) setTimeout(() => {
|
|
|
+ uni.navigateBack();
|
|
|
+ }, 500);
|
|
|
+ }).catch(err => {
|
|
|
+ loading.value = false;
|
|
|
+ console.error("保存工单失败", err);
|
|
|
+ uni.showToast({ title: '保存失败,请稍后重试', icon: 'none' });
|
|
|
+ });
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+function clickRadio(value, key) {
|
|
|
+ form[key] = form[key] == value ? "" : value;
|
|
|
+ if (key == 'passcheck') {
|
|
|
+ if (value == '异常') {
|
|
|
+ rules.textedit[0].required = true;
|
|
|
+ rules.fileupload[0].required = true;
|
|
|
+ } else {
|
|
|
+ rules.textedit[0].required = workpresetjson.textedit == 11;
|
|
|
+ rules.fileupload[0].required = workpresetjson.fileupload == 11;
|
|
|
+ }
|
|
|
+ uFormRef.value.setRules(rules);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function uploadCallback(list) {
|
|
|
+ console.log("上传回调", list);
|
|
|
+ form.fileupload = list.fileList.length ? '1' : '';
|
|
|
+ console.log("form", form)
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+.content {
|
|
|
+ width: 100vw;
|
|
|
+ padding: 20px;
|
|
|
+ box-sizing: border-box;
|
|
|
+ min-height: 100vh;
|
|
|
+ background: #fff;
|
|
|
+
|
|
|
+
|
|
|
+ .picker {
|
|
|
+ width: 100%;
|
|
|
+ // border-bottom: 1px solid #dadbde;
|
|
|
+ font-size: 32rpx;
|
|
|
+ color: #606266;
|
|
|
+ padding: 9px;
|
|
|
+ border-radius: 8rpx;
|
|
|
+ }
|
|
|
+
|
|
|
+ .title {
|
|
|
+ font-size: 34rpx;
|
|
|
+ color: #4773EE;
|
|
|
+ margin: 20rpx 0;
|
|
|
+ font-weight: bold;
|
|
|
+ }
|
|
|
+
|
|
|
+ .options-box {
|
|
|
+ position: relative;
|
|
|
+ top: -6rpx;
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ width: 100%;
|
|
|
+ box-sizing: border-box;
|
|
|
+
|
|
|
+ .option {
|
|
|
+ border: 1px solid #dadbde;
|
|
|
+ border-radius: 8rpx;
|
|
|
+ padding: 10rpx 20rpx;
|
|
|
+ margin-right: 18rpx;
|
|
|
+ margin-top: 12rpx;
|
|
|
+ transition: background-color 0.3s, color 0.3s, border-color 0.3s;
|
|
|
+ text-align: center;
|
|
|
+ min-width: 80rpx;
|
|
|
+ }
|
|
|
+
|
|
|
+ .active {
|
|
|
+ background: #006EF7;
|
|
|
+ color: #fff;
|
|
|
+ border-color: #006EF7;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+</style>
|