| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571 | <template>    <view class="content">        <up-form :model="form" labelWidth="70" ref="uFormRef" disabled>            <block v-if="workpresetjson.questionedit != 0">                <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 maxlength="499" :disabled="data.status == 1" 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: '1', name: '正常' },                        { value: '0', name: '异常' }]" :key="item.value" @click="clickRadio(item.value, 'passcheck')">                        {{ item.name }}                    </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: '1', name: '是' },                            { value: '0', name: '否' }]" :key="item.value" @click="clickRadio(item.value, 'additem')">                            {{ item.name }}                        </view>                    </view>                </up-form-item>                <block v-if="form.additem == 1">                    <up-form-item :label="`新配件(${data.newtitems.length})`" prop="newtitems" required>                        <view class="options-box">                            <view class="option active" hover-class="navigator-hover" @click="toAddItem('newtitems')">                                + 去添加新配件                            </view>                        </view>                    </up-form-item>                    <accList :list="data.newtitems" :disabled="data.status == 1"                        @deleteItem="deleteItem($event, 'newtitems')" />                    <up-form-item :label="`旧配件(${data.oldtitems.length})`">                        <view class="options-box">                            <view class="option active" hover-class="navigator-hover" @click="toAddItem('oldtitems')">                                + 去添加旧配件                            </view>                        </view>                    </up-form-item>                    <accList :list="data.oldtitems" :disabled="data.status == 1"                        @deleteItem="deleteItem($event, 'oldtitems')" />                </block>            </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 :disabled="data.status == 1" 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 :disabled="data.status == 1" ref="upload" :fileList="data.attinfos"                    @uploadCallback="uploadCallback" />                <up-image v-if="data.status == 1 && data.attinfos.length == 0" :show-loading="true" src="" width="80px"                    height="80px" @click="click"></up-image>            </up-form-item>            <up-form-item v-if="workpresetjson.textedit != 0" label="文字说明" prop="textedit"                :required="rules.textedit[0].required">                <up-textarea maxlength="499" :disabled="data.status == 1" v-model="form.textedit" placeholder="文字说明"                    autoHeight height="20" />            </up-form-item>        </up-form>        <view class="but-box" v-if="data.status != '1'">            <view class="but-box-item" @click="save">                <My-button :customStyle="{                    'background-color': '#FFFFFF',                    'color': '#3874F6',                    height: '80rpx',                }" text="保存" :disabled="loading" :loading="loading1" />            </view>            <view class="but-box-item" @click="submit">                <My-button :customStyle="{                    height: '80rpx',                }" text="完成" :disabled="loading1" :loading="loading" />            </view>        </view>        <view style="height: 50px;" />        <page-container :show="true" :overlay="false" @beforeleave="beforeleave" />    </view></template><script setup>import { ref, reactive, getCurrentInstance, watch } from 'vue';import { onLoad } from '@dcloudio/uni-app';import accList from "./modules/products.vue";const { $Http } = getCurrentInstance().proxy;const uFormRef = ref(null);const upload = ref(null);let formModified = ref(false);function beforeleave(e) {    if (formModified.value && data.status != '1') {        uni.showModal({            title: '提示',            content: '是否保存当前编辑内容?',            confirmText: '保存',            cancelText: '不保存',            success: function (res) {                if (res.confirm) {                    save()                    setTimeout(() => {                        uni.navigateBack()                    }, 500);                } else if (res.cancel) {                    uni.navigateBack()                }            }        });    } else {        uni.navigateBack()    }}// 去添加配件function toAddItem(key = 'oldtitems') {    if (data.status == '1') return;    $Http.basicsData = {        selected: key,        newtitems: deepCloneArray(data.newtitems) || [],        oldtitems: deepCloneArray(data.oldtitems) || [],    }    uni.navigateTo({        url: '/pages/select/accessories'    });    $Http.selectAcc = (res) => {        data.newtitems = res.newtitems;        data.oldtitems = res.oldtitems;        form.newtitems = res.newtitems.length ? '1' : '';        uni.navigateBack();        delete $Http.selectAcc        delete $Http.basicsData    }}// 帮我写一个[{},{}] 深拷贝的方法function deepCloneArray(arr) {    return arr.map(item => {        return { ...item };    })}// 删除配件function deleteItem(item, key = 'oldtitems') {    data[key] = data[key].filter(v => v.itemid !== item.itemid);    if (key == 'newtitems') form.newtitems = data.newtitems.length ? '1' : '';}const form = reactive({    textedit: '', // 上传文本    confirm: "", // 确认信息    itemtype: "", // 故障类型    questionedit: "", // 问题编辑    additem: "", // 是否更换配件    passcheck: "", //合格确认 异常时 文字和图片必填    amountpay: "", // 费用支付    fileupload: "", // 上传图片    oldtitems: "",//配件    newtitems: "",//配件});let keys = {    textedit: 'textcontent', // 文本内容    amountpay: 'amount', // 费用支付    confirm: 'confirm_value', // 确认信息    itemtype: "questionoption",    questionedit: "questionedit",}// keys 与 form 互相转换字段let formToContent = (form) => {    let content = {};    for (let key in form) {        if (keys[key]) {            content[keys[key]] = form[key];        } else {            content[key] = form[key];        }    }    if (content.amount === '') content.amount = 0;    return content;}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(() => {    data = reactive($Http.data);    delete $Http.data;    form.fileupload = data.attinfos.length ? '1' : '';    uni.setNavigationBarTitle({        title: data.title,    })    workpresetjson = Object.assign(workpresetjson, data.workpresetjson);    if (workpresetjson.additem) {        data.oldtitems = data.detail[0].oldtitems.map(item => {            item.imageUrl = item.attinfos.length ? $Http.getSpecifiedImage(item.attinfos[0]) : ''            return item;        });        data.newtitems = data.detail[0].newtitems.map(item => {            item.imageUrl = item.attinfos.length ? $Http.getSpecifiedImage(item.attinfos[0]) : ''            return item;        });        form.newtitems = data.newtitems.length ? '1' : '';        form.oldtitems = data.oldtitems.length ? '1' : '';        form.additem = form.newtitems || form.oldtitems ? '1' : '0';    }    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', validator: (rule, value) => value !== '' },            { pattern: /^(0|[1-9]\d*)(\.\d{1,2})?$/, message: '请输入正确的金额', trigger: 'blur' }        ],        fileupload: [            { required: workpresetjson.fileupload == 11, message: '请上传图片', trigger: 'change' }        ],        additem: [{ required: workpresetjson.additem == 11, message: '请选择是否更换配件', trigger: 'change' }]    })    setTimeout(() => {        if (data.passcheck == '0') {            rules.textedit[0].required = true;            rules.fileupload[0].required = true;        }        uFormRef.value.setRules(rules);    });    if (workpresetjson.questionedit) $Http.getClass(workpresetjson.questionoption).then(res => {        questionoption.value = res.data;        if (res.code !== 1) return uni.showToast({ title: res.msg, icon: 'none' });    })    for (let key in keys) {        if (data[keys[key]]) {            form[key] = data[keys[key]];            console.log(key, form[key])        }    }    // 添加表单修改监听    const originalForm = JSON.parse(JSON.stringify(form));    watch(form, (newVal) => {        if (JSON.stringify(newVal) !== JSON.stringify(originalForm)) {            formModified.value = true;        }    }, { deep: true });});// 保存const loading = ref(false);const loading1 = ref(false);function submit() {    if (loading.value) return;    if (upload.value.isUploading()) return;    let traintitem = []    try {        if (form.additem == 1) {            traintitem = data.oldtitems.map(v => {                return {                    itemid: v.itemid,                    itemname: v.itemname,                    model: v.model,                    price: v.price,                    qty: v.qty || v.packageqty || 1,                }            }).concat(data.newtitems.map(v => {                return {                    itemid: v.itemid,                    itemname: v.itemname,                    model: v.model,                    price: v.price,                    qty: v.qty || v.packageqty || 1,                    isnew: 1                }            }))        } else {            traintitem = []        }    } catch (error) {    }    uFormRef.value.validate().then(valid => {        if (valid) {            let content = {                "sa_workorderid": data.sa_workorderid,                "sa_workorder_nodeid": data.sa_workorder_nodeid,                isconfirm: 1,                ...formToContent(form),                traintitem            };            uni.showModal({                title: '提示',                content: '是否确定完成工序?完成后将无法再次编辑。',                confirmText: '完成',                success: function (res) {                    if (res.confirm) {                        loading.value = true;                        $Http.basic({                            "id": "20230209094203",                            "sa_workorderid": data.sa_workorderid,                            "sa_workorder_nodeid": data.sa_workorder_nodeid,                            content                        }).then(res => {                            loading.value = false;                            console.log("提交工单", res);                            if (res.code == 1) {                                loading.value = true;                                upload.value.saveFileLinks('sa_workorder_node', data.sa_workorder_nodeid).then((s) => {                                    loading.value = false;                                    formModified.value = false;                                    setTimeout(() => {                                        uni.navigateBack()                                    }, 800);                                })                            }                            uni.showToast({ title: res.code !== 1 ? res.msg : "提交成功", icon: 'none', mask: res.code == 1 });                        }).catch(err => {                            loading.value = false;                            console.error("提交工单失败", err);                            uni.showToast({ title: '提交失败,请稍后重试', icon: 'none' });                        });                    }                }            });        }    })}function save() {    if (loading1.value) return;    if (upload.value.isUploading()) return;    let traintitem = []    try {        if (form.additem == 1) {            traintitem = data.oldtitems.map(v => {                return {                    itemid: v.itemid,                    itemname: v.itemname,                    model: v.model,                    price: v.price,                    qty: v.qty || v.packageqty || 1,                }            }).concat(data.newtitems.map(v => {                return {                    itemid: v.itemid,                    itemname: v.itemname,                    model: v.model,                    price: v.price,                    qty: v.qty || v.packageqty || 1,                    isnew: 1                }            }))        } else {            traintitem = []        }    } catch (error) {    }    let content = {        "sa_workorderid": data.sa_workorderid,        "sa_workorder_nodeid": data.sa_workorder_nodeid,        isconfirm: 0,        ...formToContent(form),        traintitem    };    loading1.value = true;    $Http.basic({        "id": "20230209094203",        "sa_workorderid": data.sa_workorderid,        "sa_workorder_nodeid": data.sa_workorder_nodeid,        content    }).then(res => {        loading1.value = false;        console.log("保存工单", res);        if (res.code == 1) {            loading1.value = true;            upload.value.saveFileLinks('sa_workorder_node', data.sa_workorder_nodeid).then((s) => {                loading1.value = false;            })            formModified.value = false;        }        uni.showToast({ title: res.code !== 1 ? res.msg : "保存成功", icon: 'none' });    })}function clickRadio(value, key) {    if (data.status == '1') return;    form[key] = form[key] == value ? "" : value;    if (key == 'passcheck') {        if (form[key] == '0') {            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);    } else if (key == 'additem') {        if (form[key] == '1') {            rules.newtitems = [{ required: true, message: '请选择新配件', trigger: 'change' }];        } else {            delete rules.newtitems;        }        if (form[key] == '1' && !data.oldtitems.length) toAddItem('newtitems');        form.oldtitems = data.oldtitems.length ? '1' : '';        uFormRef.value.setRules(rules);    }    console.log("form", form)}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;        }    }    .but-box {        display: flex;        align-items: center;        justify-content: space-around;        margin-top: 40rpx;        .but-box-item {            width: 45%;        }    }}</style>
 |