Files
gjt_mini/pageSub/truckPreparation/detail.vue
2025-12-30 09:44:46 +08:00

1601 lines
47 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<view class="container">
<u-collapse :value="['basic', 'maintain']" :border="false">
<u-collapse-item title="基本信息" ref="uploadCollapse" name="basic">
<!-- <view class="header">基本信息</view> -->
<view class="item">
<view class="title required">车牌号</view>
<u--input
border="surround"
:value="info.plateNumber"
disabled
fontSize="26"
></u--input>
</view>
<view class="item">
<view class="title required">车型</view>
<u--input
border="surround"
:value="info.modelName"
disabled
fontSize="26"
></u--input>
</view>
<view class="item">
<view class="title required">资产运营城市</view>
<u--input
border="surround"
v-model="info.address"
disabled
fontSize="26"
></u--input>
</view>
<view class="item">
<view class="title required">停车场</view>
<u-picker
:show="showParkingPicker"
:columns="[parkingList]"
keyName="dicName"
:immediateChange="true"
@confirm="confirmPark"
@cancel="showParkingPicker = false"
>
</u-picker>
<u--input
border="surround"
disabledColor="#ffffff"
disabled
fontSize="26"
:value="parkingList[info.parkingSel].dicName"
@tap="!_disabled && (showParkingPicker = true)"
>
</u--input>
</view>
<view class="item">
<view class="title required">仪表盘里程</view>
<u-input
border="surround"
:disabled="_disabled"
v-model="info.instrumentRange"
fontSize="26"
type="digit"
>
</u-input>
</view>
<view class="item">
<view class="title required">剩余氢量</view>
<u-input
border="surround"
:disabled="_disabled"
v-model="info.leftHydrogen"
fontSize="26"
type="digit"
:customStyle="{
paddingTop: '0',
paddingBottom: '0',
paddingRight: '0',
}"
>
<template slot="suffix">
<uni-section type="line">
<uni-data-select
v-model="info.hydrogenUnit"
placeholder="请选择"
:localdata="range"
@change="changeUnit"
:disabled="_disabled"
></uni-data-select>
</uni-section>
</template>
</u-input>
<!-- @change="(value) => (datas.truckList[index].instrumentRange = value)" -->
</view>
<view class="item">
<view class="title required">剩余电量</view>
<u-input
border="surround"
:disabled="_disabled"
v-model="info.leftElectricity"
fontSize="26"
type="digit"
>
</u-input>
<!-- @change="(value) => (datas.truckList[index].instrumentRange = value)" -->
</view>
<view class="item">
<view class="title required">整备类型</view>
<u-picker
:show="showPreTypePicker"
:columns="[preTypeList]"
keyName="dicName"
:immediateChange="true"
@confirm="confirmPreType"
@cancel="showPreTypePicker = false"
>
</u-picker>
<u--input
border="surround"
:disabledColor="_disabled ? '#f5f7fa' : '#ffffff'"
disabled
fontSize="26"
:value="preTypeList[info.preTypeSel].dicName"
@tap="!_disabled && (showPreTypePicker = true)"
>
</u--input>
</view>
<view class="item">
<view class="title required">在库时长</view>
<u-input
border="surround"
disabled
v-model="info.statusDuration"
fontSize="26"
type="digit"
>
</u-input>
</view>
<view class="item">
<view class="title"
>试车时间
<checkbox-group
@change="testChange"
:disabled="_disabled"
style="margin-left: 30rpx; display: inline-block"
>
<checkbox
:checked="testChecked"
:disabled="_disabled"
></checkbox></checkbox-group
></view>
<u-datetime-picker
placeholder="请选择日期"
:disabled="_disabled"
:show="lastTestRunDatePicker"
mode="date"
@confirm="(e) => confirmTestTime(e)"
@cancel="lastTestRunDatePicker = false"
></u-datetime-picker>
<u--input
border="surround"
:disabledColor="_disabled ? '#f5f7fa' : '#ffffff'"
fontSize="26"
disabled
:value="formatDateTime(info.lastTestRunDate, 'date')"
@tap="!_disabled && (lastTestRunDatePicker = true)"
>
</u--input>
</view>
<view class="item" style="margin-bottom: 20rpx">
<button class="btn checkList required" @tap="openCheckListPopup">
备车检查单
</button>
</view>
</u-collapse-item>
<view class="header" style="margin-top: 15px">保险信息</view>
<view class="item">
<view class="title">商业险到期时间</view>
<u--input
border="surround"
:disabledColor="'#f5f7fa'"
fontSize="26"
disabled
:value="formatDateTime(info.businessInsureExpireDate, 'date')"
>
</u--input>
</view>
<view class="item">
<view class="title">交强险到期时间</view>
<u--input
border="surround"
:disabledColor="'#f5f7fa'"
fontSize="26"
disabled
:value="formatDateTime(info.compulsoryInsureExpireDate, 'date')"
>
</u--input>
</view>
<u-collapse-item title="保养记录" ref="maintainCollapse" name="maintain">
<!-- <view class="header">日常维护</view> -->
<u-checkbox-group v-model="checkoutIds" size="36" placement="column">
<view v-for="(item, index) in info.agentItemListVoList" :key="index">
<u-cell-group>
<u-cell :border="false">
<view slot="title" class="u-slot-title">
{{ `序号${index + 1}` }}
<view class="viewBtn" @tap="viewRecord(item)"
>查看历史记录</view
>
</view>
<view slot="value" class="u-slot-value">
<u-checkbox
:customStyle="{ marginBottom: '8px' }"
:key="index"
:label="` `"
:name="item.id"
>
</u-checkbox>
</view>
</u-cell>
<u-cell
:border="false"
title="养护项目"
:value="item.maintainItem"
></u-cell>
<u-cell
:border="false"
:titleStyle="`font-size: 13px;color:${
item.maintenanceDueTime &&
item.maintenanceDueTime <= new Date().getTime()
? 'red'
: ''
}`"
title="保养到期时间"
:value="formatDateTime(item.maintenanceDueTime)"
></u-cell>
<u-cell
:border="false"
:titleStyle="`font-size: 13px;color:${
info.totalMileage &&
item.maintenanceDueMileage &&
info.totalMileage > item.maintenanceDueMileage
? 'red'
: ''
}`"
title="保养到期公里数"
:value="item.maintenanceDueMileage || ''"
></u-cell>
<u-cell
:border="false"
titleStyle="font-size: 13px"
title="保养公里周期km"
:value="item.kilometerCycle"
></u-cell>
<u-cell
:border="false"
titleStyle="font-size: 13px"
title="保养时间周期(月)"
:value="item.timeCycle"
></u-cell>
</u-cell-group>
</view>
</u-checkbox-group>
</u-collapse-item>
<view
class="item"
v-if="!_disabled && checkoutIds && checkoutIds.length > 0"
>
<button class="btn checkList" @tap="makeTodo">生成保养待办</button>
</view>
</u-collapse>
<!-- <view class="item">
<view class="title">养护项目</view>
<view class="line">
<view class="text-small">{{ item.maintainItem }} </view>
</view>
</view> -->
<!-- <view class="item">
<view class="title">保养到期时间</view>
<view class="line">
<view class="text-small"
>{{ formatDateTime(item.maintenanceDueTime) }}
</view>
</view>
</view>
<view class="item">
<view class="title">保养到期公里数</view>
<view class="line">
<view class="text-small"
>{{ item.maintenanceDueMileage || "" }}
</view>
</view>
</view>
<view class="item">
<view class="title">保养公里周期km</view>
<view class="line">
<view class="text-small">{{ item.kilometerCycle }} </view>
</view>
</view>
<view class="item">
<view class="title">保养时间周期</view>
<view class="line">
<view class="text-small">{{ item.timeCycle }} </view>
</view>
</view> -->
<!-- <view class="item">
<view class="title font30 required">系统启动检查</view>
<view class="content">
<view class="text" v-if="info.preTypeSel === 1">
隔10天启动车辆1小时以上检查仪表盘是否有故障灯空调是否正常有冷机车辆车冷机温度是否正常确保电气系统动力系统正常运转
</view>
<view class="text" v-else>
启动车辆30分钟以上,检查仪表盘是否有故障灯空调是否正常有冷机车辆冷机温度是否正常确保电气系统动力系统正常运转混动车辆混动模式能正常运行30分钟
</view>
<checkbox-group @change="changeCb1" :disabled="_disabled">
<checkbox
:disabled="_disabled"
value="startupItemCheck"
:checked="info.startupItemCheck"
></checkbox>
</checkbox-group>
</view>
</view>
<view class="item">
<view class="title font30 required">油液水检查</view>
<view class="content">
<view class="text"> 确保所有油液水加注上线 </view>
<checkbox-group @change="changeCb2" :disabled="_disabled">
<checkbox
value="oilWaterCheck"
:checked="info.oilWaterCheck"
:disabled="_disabled"
></checkbox>
</checkbox-group>
</view>
</view>
<view class="item">
<view class="title font30 required">轮胎检查</view>
<view class="content">
<view class="text"> 检查轮胎气压是否正常 </view>
<checkbox-group @change="changeCb3" :disabled="_disabled">
<checkbox
value="tyreCheck"
:checked="info.tyreCheck"
:disabled="_disabled"
></checkbox
></checkbox-group>
</view>
</view>
<view class="item">
<view class="title font30">试车</view>
<view class="content">
<view class="text" v-if="info.preTypeSel === 1">
混动车辆混动模式能正常运行10分钟
</view>
<view class="text" v-else>
每一个月试车一次试车公里数为40公里观察其车况刹车转向燃料电池系统是否有异常
</view>
<checkbox-group @change="changeCb4" :disabled="_disabled">
<checkbox
value="testRun"
:checked="info.testRun"
:disabled="_disabled"
></checkbox
></checkbox-group>
</view>
</view>
<view class="item">
<view class="title">试车时间</view>
<u-datetime-picker
:show="showTestRunPicker"
mode="date"
@confirm="confirmTestRunDate"
@cancel="showTestRunPicker = false"
></u-datetime-picker>
<u--input
border="surround"
:disabledColor="_disabled ? '#f5f7fa' : '#ffffff'"
disabled
fontSize="26"
:value="formatDateTime(info.lastTestRunDate)"
@tap="!_disabled && (showTestRunPicker = true)"
>
</u--input>
</view> -->
<!-- <view class="header">保养信息</view>
<view class="item">
<view class="title required">下次养护日期</view>
<u-datetime-picker
:show="showNextDatePicker"
mode="date"
@confirm="confirmNextDate"
@cancel="showNextDatePicker = false"
></u-datetime-picker>
<u--input
border="surround"
:disabledColor="_disabled ? '#f5f7fa' : '#ffffff'"
disabled
fontSize="26"
:value="formatDateTime(info.nextMaintenanceDate)"
@tap="!_disabled && (showNextDatePicker = true)"
>
</u--input>
</view>
<view class="item">
<view class="title required">下次养护公里数</view>
<u-input
border="surround"
v-model="info.nextMaintenanceKilometers"
fontSize="26"
:disabled="_disabled"
type="digit"
>
</u-input>
</view>
<view class="item">
<view class="title">下次养护项目</view>
<u-picker
:show="showProjectPicker"
:columns="[projectList]"
keyName="dicName"
:immediateChange="true"
@confirm="confirmProject"
@cancel="showProjectPicker = false"
>
</u-picker>
<u--input
border="surround"
disabledColor="#ffffff"
disabled
fontSize="26"
:value="projectList[info.projectSel].dicName"
@tap="!_disabled && (showProjectPicker = true)"
>
</u--input>
</view> -->
<view class="item">
<view class="title">瑕疵照片</view>
<u-upload
:fileList="fileList12"
@afterRead="afterRead"
@delete="deletePic"
:width="200"
:height="200"
:disabled="_disabled"
:deletable="!_disabled"
name="12"
></u-upload>
</view>
<view class="item">
<view class="title">备注</view>
<u--textarea
border="surround"
v-model="info.remark"
fontSize="26"
autoHeight
></u--textarea>
</view>
<view class="btns">
<button
class="save"
:class="{ disabled: _disabled }"
:disabled="_disabled"
@tap="editTruckPreparation(false)"
>
保存
</button>
<button
class="save"
:class="{ disabled: _disabled }"
:disabled="_disabled"
@tap="editTruckPreparation(true)"
>
备车完成
</button>
<button class="cancel" @tap="navigateBack">取消</button>
</view>
<page-container
:show="checkListShow"
:duration="0"
:overlay="false"
@beforeleave="checkListShow = false"
>
<u-popup
:show="checkListShow"
mode="right"
@close="checkListShow = false"
>
<scroll-view scroll-y="true" style="height: 95vh">
<no-bad-table
v-if="popupType === 1"
:columns="columns"
:list="preparationFormDataList"
:isRead="_disabled"
:spanArr="spanArr"
:slot-cols="['dataCategory', 'dataName', 'takeTruck', 'remark']"
:span-method="objectSpanMethod"
>
<template v-slot="{ row, col, index, isRead }">
<view
v-if="col.key == 'dataCategory'"
style="white-space: pre-wrap"
>
{{ row.dataCategory }}
</view>
<view
v-else-if="col.key == 'dataName'"
style="white-space: pre-wrap"
>
{{ row.dataName }}
</view>
<view
v-else-if="col.key == 'takeTruck'"
style="display: flex; justify-content: center"
>
<u-switch
size="50"
v-model="row.takeTruck"
:disabled="isRead"
@change="switchTakeTruck(index)"
inactiveColor="#f5f7fa"
activeColor="#7ba746"
>
</u-switch>
</view>
<view
v-else-if="col.key == 'remark' && !row.notUpdate"
style="display: flex; justify-content: center"
>
<u--input
border="surround"
fontSize="26"
:disabled="isRead"
:value="row.remark"
@change="inputQuality($event, index)"
>
</u--input>
</view>
</template>
</no-bad-table>
<viwe v-else>
<view
v-for="(item, index) in recordList"
class="truckItem"
:key="index"
>
<view style="text-align: center">{{
item.maintainItem + "保养"
}}</view>
<view class="border">
<view class="flexWrap">
<view class="item" style="margin-right: 56rpx">
<u-cell-group :border="false">
<u-cell
:border="false"
title="工时费"
titleStyle="font-size: 13px"
:value="item.hourFee"
></u-cell>
<u-cell
:border="false"
titleStyle="font-size: 13px"
title="材料费"
:value="item.materialsExpenses"
></u-cell>
</u-cell-group>
</view>
<view class="item">
<u-cell-group :border="false">
<u-cell
:border="false"
titleStyle="font-size: 13px"
title="材料费(公司自采)"
:value="item.companyMaterialsExpenses"
></u-cell>
<u-cell
:border="false"
title="合计"
titleStyle="font-size: 13px"
:value="item.totalFee"
></u-cell>
</u-cell-group>
</view>
</view>
<u-cell-group :border="false">
<u-cell
:border="false"
title="维修站"
titleStyle="font-size: 13px"
:value="item.maintainSiteName"
></u-cell>
<u-cell
:border="false"
titleStyle="font-size: 13px"
title="实际保养日期"
:value="formatDateTime(item.actualMaintenanceDate)"
></u-cell>
<u-cell
:border="false"
titleStyle="font-size: 13px"
title="实际保养公里数"
:value="item.actualMaintenanceMileage || ''"
></u-cell>
<u-cell
:border="false"
titleStyle="font-size: 13px"
title="负责人"
:value="item.handlerName"
></u-cell>
</u-cell-group>
</view>
</view>
</viwe>
<view class="btns">
<button
class="save"
v-if="!isRead && popupType === 1"
@tap="saveFormDataList"
>
保存
</button>
<button class="cancel" @tap="cancelFormDataChange">取消</button>
</view>
</scroll-view>
</u-popup>
</page-container>
<view style="width: 0px; height: 0px; overflow: hidden">
<canvas
:style="
'width: ' +
canvasWidth +
'px; height:' +
canvasHeight +
'px;left:8888px'
"
canvas-id="myCanvas"
></canvas>
</view>
<u-loading-page
bg-color="#ffffff"
color="#7ba746"
font-size="24"
:loading="loading"
:loading-text="loadingText"
></u-loading-page>
</view>
</template>
<script>
export default {
options: {
styleIsolation: "shared", // 解除样式隔离
},
data() {
return {
id: 0,
info: {
parkingSel: null,
projectSel: null,
preTypeSel: null,
// instrumentRange: null,
// startupItemCheck: false, // 日常维护选中列表
// oilWaterCheck: false, // 日常维护选中列表
// tyreCheck: false, // 日常维护选中列表
}, // 该备车车辆记录的数据
preTypeList: [], // 整备类型列表
parkingList: [], //停车场列表
projectList: [], //养护项目列表
truckType: [],
isRead: false,
showPreTypePicker: false, // 整备类型弹窗
showParkingPicker: false,
showProjectPicker: false, // 养护项目弹窗
showNextDatePicker: false, // 养护时间弹窗
showTestRunPicker: false, // 试车时间弹窗
prepareOk: false, // 备车完成 switch
checkListShow: false, // 检查单弹窗
popupType: 1, // 弹窗类型 1:备车检查单 2:保养记录
preparationFormDataList: [], // 备车单数据
spanArr: [],
columns: [
{
title: "检查类别",
key: "dataCategory",
},
{
title: "检查项目",
key: "dataName",
},
{
title: "选择",
key: "takeTruck",
},
{
title: "备注",
key: "remark",
},
],
range: [
{ value: 1, text: "%" },
{ value: 2, text: "MPa" },
{ value: 3, text: "kg" },
],
inStoreList: [], // 在库状态车辆列表
lastTestRunDatePicker: false, // 试车时间
checkoutIds: [], // 检查单选中项
testChecked: false, // 试车时间复选框
recordList: [], // 保养记录列表
canvasWidth: 0,
canvasHeight: 0,
loading: false,
loadingText: "加载中...",
address: "", // 水印位置
fileList12: [],
};
},
computed: {
_disabled() {
return this.isRead;
},
},
async onLoad(options) {
if (options.id) {
this.id = options.id;
}
if (options.isRead) {
this.isRead = Number(options.isRead);
}
await this.getParkList(); // 获取停车场列表
await this.getPreTypeList(); // 获取整备类型列表
this.getData();
this.getLocation();
},
methods: {
getLocation() {
uni.getLocation({
type: "wgs84",
success: (res) => {
const longitude = res.longitude;
const latitude = res.latitude;
this.$api.truckRent
.getAddress({ longitude, latitude })
.then((res) => {
this.address = res?.data ?? "浙江省嘉兴市";
});
},
fail: (res) => {
console.log(res);
},
});
},
// 新增图片
async afterRead(event) {
this.loading = true;
this.loadingText = "添加水印中...";
let lists = [].concat(event.file);
let fileListLen = this[`fileList${event.name}`].length;
lists.map((item) => {
this[`fileList${event.name}`].push({
...item,
status: "uploading",
message: "上传中",
});
});
const fileSize = event.file.size / 1024 ** 2; // 图片多少MB
console.log(`event.file:\n`, event.file);
for (let i = 0; i < lists.length; i++) {
let waterUrl = "";
try {
waterUrl = await this.addWatermark(lists[i].url, fileSize);
} catch (e) {
console.log("添加水印报错\n", e);
this[`fileList${event.name}`].splice(fileListLen, 1);
return;
}
const result = await this.uploadFilePromise(waterUrl);
let item = this[`fileList${event.name}`][fileListLen];
this[`fileList${event.name}`].splice(
fileListLen,
1,
Object.assign(item, {
status: "success",
message: "",
url: result.data?.url ?? "",
thumb: waterUrl,
})
);
fileListLen++;
const imgUrl = result.data?.url ?? "";
if (event.name == "12") {
this.info.blemish.push({
path: imgUrl,
fileName: event.file.name,
});
}
}
this.$nextTick(() => {
this.$refs.uploadCollapse.init();
});
},
// 删除图片
deletePic(event) {
const fileList = this[`fileList${event.name}`];
if (fileList.some((x) => x.status == "uploading")) {
this.alert(`请等待现有图片上传完成后再操作`);
return;
}
this[`fileList${event.name}`].splice(event.index, 1);
if (event.name == "12") {
this.info.blemish.splice(event.index, 1);
}
},
//水印时间
getNowDateTime() {
let currentTime = new Date();
let year = currentTime.getFullYear();
let month = currentTime.getMonth() + 1;
let day = currentTime.getDate();
let hours = currentTime.getHours();
let minutes = currentTime.getMinutes();
month = month < 10 ? "0" + month : month;
day = day < 10 ? "0" + day : day;
hours = hours < 10 ? "0" + hours : hours;
minutes = minutes < 10 ? "0" + minutes : minutes;
return `${year}-${month}-${day} ${hours}:${minutes}`;
},
// 图片添加水印
async addWatermark(img, fileSize) {
const image = img;
let res1 = await new Promise((resolve, reject) => {
uni.getImageInfo({
src: img,
success: (res) => {
// 设置canvas宽高等于原图片宽高
this.canvasWidth = res.width;
this.canvasHeight = res.height;
// 创建 canvas 的绘图上下文
const ctx = uni.createCanvasContext("myCanvas", this);
// 绘制图片
ctx.drawImage(image, 0, 0, res.width, res.height);
//先加logo
// const watermarkImg = this.$refs.logo;
ctx.drawImage("/static/logo3.png", 10, res.height - 150, 200, 40.8);
//再加时间
ctx.font = "25px 黑体";
ctx.fillStyle = "#fff";
ctx.textAlign = "left";
ctx.fillText(this.getNowDateTime(), 10, res.height - 70);
//最后加地址
ctx.font = "25px 黑体";
ctx.fillStyle = "#fff";
ctx.textAlign = "left";
ctx.fillText(this.address, 10, res.height - 30);
// 画到 canvas 中
ctx.draw(false, () => {
// 将画布转化为图片
// 设置延时,延时的秒数和图片体积正相关,越大的图片,延时越长
// 如果不延时,导出的图片可能存在有黑边、只显示部分 等问题
let timeout = 0;
if (fileSize <= 3) {
timeout = 1000;
} else {
timeout = 1000 * (fileSize / 3);
}
setTimeout(() => {
uni.canvasToTempFilePath(
{
canvasId: "myCanvas",
fileType: "jpg",
quality: fileSize <= 3 ? 1 : 0.75, // 如果不到3MB则不压缩否则压缩
success: (res) => {
console.log(res);
this.loading = false;
resolve(res.tempFilePath);
},
fail: (err) => {
this.loading = false;
reject(err);
},
},
this
);
}, timeout);
});
},
});
});
return res1;
},
uploadFilePromise(url) {
return new Promise((resolve, reject) => {
let a = uni.uploadFile({
url: "/attachment/upload",
filePath: url,
name: "file",
success: (res) => {
resolve(JSON.parse(res.data || {}));
},
fail: (e) => {
reject(e);
},
});
});
},
viewRecord(row) {
this.$api.maintainTodo
.getRecords({
truckId: this.info.truckId,
maintainItemId: row.id,
})
.then((res) => {
console.log(`res:`, res);
this.recordList =
res?.data.map((item) => {
item.totalFee =
Number(item.hourFee || 0) +
(Number(item.materialsExpenses) || 0) +
(Number(item.companyMaterialsExpenses) || 0);
return item;
}) || [];
this.popupType = 2; // 保养记录
this.checkListShow = true;
uni.setNavigationBarTitle({
title: "保养记录",
});
});
},
makeTodo() {
console.log("makeTodo");
console.log(this.checkoutIds);
//现在itemList的id或者maintainItemId是空的 checkoutIds也是空的做不了过滤
uni.showModal({
title: "提示",
content: "确认生成保养代办吗?",
success: (res) => {
if (res.confirm) {
let params = {
truckId: this.info.truckId,
itemList: this.info.agentItemListVoList.filter((item) =>
this.checkoutIds.includes(item.id)
),
};
this.$api.maintainTodo.add(params).then((res) => {
if (res) {
uni.showToast({
title: "操作成功",
icon: "success",
duration: 1500,
});
}
});
}
},
});
},
checkboxChange(n) {
console.log("change", n);
},
// 试车时间
confirmTestTime(e) {
this.info.lastTestRunDate = e.value;
this.lastTestRunDatePicker = false;
},
testChange(e) {
console.log(e);
console.log(this.info.lastTestRunDate);
if (e?.detail?.value && e?.detail?.value.length) {
this.oldLastTestRunDate = this.info.lastTestRunDate;
this.info.lastTestRunDate = new Date().getTime();
} else {
this.info.lastTestRunDate = this.oldLastTestRunDate;
}
},
changeUnit(e) {
this.info.hydrogenUnit = e;
},
// changeCb1(e) {
// if (e.detail.value.length > 0) {
// this.info.startupItemCheck = 1;
// } else {
// this.info.startupItemCheck = 0;
// }
// },
// changeCb2(e) {
// if (e.detail.value.length > 0) {
// this.info.oilWaterCheck = 1;
// } else {
// this.info.oilWaterCheck = 0;
// }
// },
// changeCb3(e) {
// if (e.detail.value.length > 0) {
// this.info.tyreCheck = 1;
// } else {
// this.info.tyreCheck = 0;
// }
// },
// changeCb4(e) {
// if (e.detail.value.length > 0) {
// this.info.testRun = 1;
// this.info.lastTestRunDate = new Date().getTime();
// } else {
// this.info.testRun = 0;
// }
// },
async getParkList() {
await this.$api.returnCar
.getParkingPageList({
pageNo: 1,
pageSize: 999,
})
.then((res) => {
if (res) {
let datas = res?.data;
this.parkingList = datas.records.map((item) => {
return {
dicCode: item.id,
dicName: item.parkingName,
};
});
}
});
},
async getPreTypeList() {
this.$api.truckPreparation.getPreTypeList().then((res) => {
console.log(`res:`, res);
this.preTypeList = res;
});
},
getData() {
this.$api.truckPreparation.getById({ id: this.id }).then((res) => {
if (res.code != 200) {
return;
}
console.log(`res:`, res.data);
this.info = res.data;
this.info.agentItemListVoList = res.data?.agentItemListVoList?.map(
(item) => {
item.totalMileage = this.info.instrumentRange || 0;
item.maintainItemId = item.id;
return item;
}
);
const parkingIndex =
this.parkingList.findIndex(
(item) => item.dicCode == res.data?.parkingId
) ?? "";
this.$set(this.info, "parkingSel", parkingIndex); //set大法好
const preTypeIndex =
this.preTypeList.findIndex(
(item) => item.dicCode == res.data?.preparationType
) ?? "";
this.$set(this.info, "preTypeSel", preTypeIndex); //set大法好
// const projectIndex =
// this.projectList.findIndex(
// (item) => item.dicCode == res.data?.projectId
// ) || "";
// this.$set(this.info, "projectSel", projectIndex); //set大法好
this.preparationFormDataList = this.processFormDataList(
this.deepClone(this.info.preparationFormDataList)
);
this.getSpanArr(this.preparationFormDataList);
this.fileList12 = this.info.blemish.map((x) => ({
url: x.path,
name: x.fileName,
}));
this.$nextTick(() => {
this.$refs.uploadCollapse.init();
this.$refs.maintainCollapse.init();
});
// console.log(`this.info:\n`, this.info)
console.log(
`this.preparationFormDataList:\n`,
this.preparationFormDataList
);
});
},
//试车时间
confirmTestRunDate(e) {
this.info.lastTestRunDate = e.value;
this.showTestRunPicker = false;
},
//养护时间
confirmNextDate(e) {
this.info.nextMaintenanceDate = e.value;
this.showNextDatePicker = false;
},
//整备类型确认
confirmPreType(e) {
this.info.preTypeSel = e.indexs[0];
this.showPreTypePicker = false;
},
//项目确认
confirmProject(e) {
this.info.projectSel = e.indexs[0];
this.showProjectPicker = false;
},
//停车场确认
confirmPark(e) {
this.info.parkingSel = e.indexs[0];
this.showParkingPicker = false;
},
getDicValue(dic, dicCode) {
if (dic.length == 0) {
return "";
}
return dic.find((x) => x.dicCode == dicCode)?.dicName ?? "";
},
formatDateTime(obj, type = "date") {
if (obj == null) {
return "";
}
// 精确到日
if (type == "date") {
let date = new Date(obj);
let y = 1900 + date.getYear();
let m = "0" + (date.getMonth() + 1);
let d = "0" + date.getDate();
return (
y +
"-" +
m.substring(m.length - 2, m.length) +
"-" +
d.substring(d.length - 2, d.length)
);
}
// 精确到小时
else if (type == "hour") {
const date = new Date(obj); // 将时间戳转换为毫秒
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, "0"); // 月份从0开始
const day = String(date.getDate()).padStart(2, "0");
const hour = String(date.getHours()).padStart(2, "0");
return `${year}-${month}-${day} ${hour}:00`;
}
},
timestampToDateAndBack(timestamp) {
const date = new Date(timestamp);
const year = date.getFullYear();
const month = (date.getMonth() + 1).toString().padStart(2, "0"); // 月份从0开始所以要+1
const day = date.getDate().toString().padStart(2, "0");
const formattedDate = `${year}-${month}-${day}`;
const newTimestamp = new Date(`${formattedDate} 00:00:00`).getTime();
return newTimestamp;
},
getNowTimestamp() {
// 获取当前时间精确到小时的时间戳
const now = new Date();
now.setMinutes(0, 0, 0); // 设置分钟、秒、毫秒为0
return now.getTime(); // 返回时间戳
},
confirmBand(e) {
console.log(e);
const brand = e.value[0].dicCode;
// 没有更改
if (brand == this.info.brand) {
this.showParkingPicker = false;
return;
}
this.info.brand = brand;
this.showParkingPicker = false;
this.info.plateNumber = "";
this.info.vin = "";
this.info.hasTailboard = "";
this.info.hasAdvertisement = "";
this.info.isHang = "";
},
navigateBack() {
uni.navigateBack();
},
switchTakeTruck(index) {
this.preparationFormDataList[index].takeTruck =
!this.preparationFormDataList[index].takeTruck;
},
inputQuality(value, index) {
this.preparationFormDataList[index].remark = value;
},
processFormDataList(dataList) {
dataList = dataList.filter((x) => x.dataName != "检查项目");
for (let item of dataList) {
if (item.takeTruck == "true") {
item.takeTruck = true;
} else if (item.takeTruck == "false") {
item.takeTruck = false;
}
}
return dataList;
},
// https://www.cnblogs.com/janni/p/12992591.html
getSpanArr(data) {
this.spanArr = [];
for (let i = 0; i < data.length; i++) {
if (i === 0) {
this.spanArr.push(1);
this.pos = 0;
} else {
// 判断当前元素与上一个元素是否相同 dataCategory (类别字段)
if (data[i].dataCategory === data[i - 1].dataCategory) {
this.spanArr[this.pos] += 1;
this.spanArr.push(0);
} else {
this.spanArr.push(1);
this.pos = i;
}
}
}
},
objectSpanMethod(row, column, rowIndex, columnIndex) {
if (columnIndex === 0) {
const _row = this.spanArr[rowIndex];
const _col = _row > 0 ? 1 : 0;
return {
rowspan: _row,
colspan: _col,
};
}
},
// https://www.kancloud.cn/uview/uview-ui_v2/2579089
deepClone(obj) {
if (obj === null) return null;
if (typeof obj !== "object") return obj;
if (obj instanceof Date) {
let date = new Date();
date.setTime(obj.getTime());
return date;
}
if (obj instanceof RegExp) {
let re = new RegExp(obj.source);
re.lastIndex = obj.lastIndex;
return re;
}
let newObj = new obj.constructor();
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = this.deepClone(obj[key]);
}
}
return newObj;
},
openCheckListPopup() {
this.popupType = 1; // 备车检查单
if (this.info.preparationFormDataList.length == 0) {
this.$api.standbyVehicle
.getFormDataListByTruckId({ id: this.info.truckId })
.then((res) => {
this.preparationFormDataList = this.processFormDataList(res.data);
this.getSpanArr(this.preparationFormDataList);
this.checkListShow = true;
uni.setNavigationBarTitle({
title: "备车检查单",
});
});
} else {
this.checkListShow = true;
uni.setNavigationBarTitle({
title: "备车检查单",
});
}
},
saveFormDataList() {
this.checkListShow = false;
this.info.preparationFormDataList = this.deepClone(
this.preparationFormDataList
);
console.log(this.info.preparationFormDataList);
uni.setNavigationBarTitle({
title: "备车信息",
});
},
cancelFormDataChange() {
if (this.popupType === 1) {
// 备车检查单需要重置
this.preparationFormDataList = this.processFormDataList(
this.deepClone(this.info.preparationFormDataList)
);
this.getSpanArr(this.preparationFormDataList);
}
this.checkListShow = false;
uni.setNavigationBarTitle({
title: "备车信息",
});
},
// 在提交前检查,是否有必填字段未填写
check() {
if (this.info.parkingSel === null || this.info.parkingSel === -1) {
this.alert("请选择停车场");
return false;
}
if (!this.info.instrumentRange) {
this.alert("请填写仪表盘里程");
return false;
}
if (!this.info.leftHydrogen) {
this.alert("请填写剩余氢量");
return false;
}
if (!this.info.hydrogenUnit) {
this.alert("请选择氢量单位");
return false;
}
if (!this.info.leftElectricity) {
this.alert("请填写剩余电量");
return false;
}
if (this.info.preTypeSel === null || this.info.preTypeSel === -1) {
this.alert("请选择整备类型");
return false;
}
// if (!this.info.startupItemCheck) {
// this.alert("请勾选系统启动检查");
// return false;
// }
// if (!this.info.oilWaterCheck) {
// this.alert("请勾选油液水检查");
// return false;
// }
// if (!this.info.tyreCheck) {
// this.alert("请勾选轮胎检查");
// return false;
// }
// if (!this.info.nextMaintenanceDate) {
// this.alert("请选择下次养护日期");
// return false;
// }
// if (!this.info.nextMaintenanceKilometers) {
// this.alert("请填写下次养护公里数");
// return false;
// }
// if (this.info.projectSel === null) {
// this.alert("请选择下次养护项目");
// return false;
// }
return true;
},
alert(msg) {
uni.showToast({
title: msg,
icon: "none",
duration: 1500,
});
},
// 保存备车信息表
editTruckPreparation(submit = false) {
if (submit && !this.check()) {
return;
}
console.log(this.info);
let params = { ...this.info };
params.submit = submit;
if (params.parkingSel !== -1)
params.parkingId = this.parkingList[params.parkingSel].dicCode;
if (params.preTypeSel !== null)
params.preparationType = this.preTypeList[params.preTypeSel].dicCode;
// params.projectId = this.projectList[params.projectSel].dicCode;
this.$api.truckPreparation.editTruckPreparation(params).then((res) => {
// todo res是接口data数据之后研究一下如何获取整个内容
if (res) {
uni.showToast({
title: submit ? "备车成功" : "保存成功",
icon: "success",
duration: 1500,
success() {
setTimeout(() => {
uni.navigateBack();
}, 1500);
},
});
}
});
},
},
onPullDownRefresh() {
uni.stopPullDownRefresh(); //刷新数据之后停止刷新效果
},
};
</script>
<style lang="less" scoped>
.truckItem {
margin-top: 30rpx;
padding: 30rpx;
.border {
margin-top: 10rpx;
border: 1px solid #7ba746;
border-radius: 20rpx;
padding: 0 20rpx;
}
.flexWrap {
display: flex;
.item {
margin-top: 0;
flex: 1;
}
}
}
.viewBtn {
display: inline-block;
font-size: 26rpx;
padding: 5rpx 10rpx;
border-radius: 10rpx;
margin-left: 10rpx;
background: #7ba746;
color: #fff;
}
/deep/ .u-upload__button text {
font-size: 48rpx !important;
}
/deep/ .u-upload__deletable {
height: 42rpx !important;
width: 42rpx !important;
}
/deep/ .u-upload__deletable text {
font-size: 32rpx !important;
line-height: 32rpx !important;
}
/deep/ .uni-select__input-text {
font-size: 26rpx !important;
text-align: right !important;
}
/deep/ .u-collapse-item__content__text {
padding: unset !important;
color: unset !important;
font-size: unset !important;
}
// /deep/ .uni-select__selector-item text {
// font-size: 26rpx !important;
// }
// /deep/ .uni-select {
// padding-right: 18rpx !important;
// border-width: 1rpx !important;
// border-color: gray !important;
// border-style: solid !important;
// border-top-width: 0 !important;
// border-right-width: 0 !important;
// border-bottom-width: 0 !important;
// }
/deep/ .uni-select {
width: 100rpx !important;
}
.container {
// background-color: #d7d7d7;
padding: 30rpx;
.header {
margin: 15rpx 0;
}
.item {
margin-top: 30rpx;
.content {
font-size: 26rpx;
color: #797979;
display: flex;
gap: 50rpx;
justify-content: space-between;
margin-bottom: 10rpx;
.text {
border: 2rpx solid #797979;
border-radius: 10rpx;
padding: 5rpx;
}
}
.title {
font-size: 26rpx;
margin-bottom: 15rpx;
&.required::before {
content: "*";
color: red;
margin-right: 3rpx;
}
}
.font30 {
font-size: 30rpx;
}
.btn.checkList {
width: 200rpx;
height: 60rpx;
font-size: 26rpx;
line-height: 26rpx;
padding: 17rpx 0;
text-align: center;
background-color: #7ba746;
color: white;
margin-left: 0;
&.required::before {
content: "*";
color: red;
margin-right: 3rpx;
}
}
}
.btns {
display: flex;
align-items: center;
justify-content: space-around;
margin-top: 40rpx;
button {
width: 200rpx;
height: 60rpx;
font-size: 26rpx;
line-height: 26rpx;
padding: 17rpx 0;
text-align: center;
}
.cancel {
background-color: white;
color: #7ba746;
border: 1rpx #7ba746 solid;
}
.save {
background-color: #7ba746;
color: white;
}
.disabled {
opacity: 0.6;
}
}
}
/deep/ picker-view {
height: 450rpx !important;
}
/deep/ .u-border {
border-width: 1rpx !important;
border-color: #dadbde !important;
border-style: solid;
}
/deep/ .u-switch {
border-color: rgba(0, 0, 0, 0.12) !important;
}
/deep/ .u-slide-right-enter-to.u-slide-right-enter-active {
width: 750rpx;
}
/deep/ .td_wrap {
height: auto !important;
}
/deep/ checkbox-group view.td {
width: 186rpx !important;
}
/deep/ checkbox-group view.td_wrap {
width: 186rpx !important;
}
/deep/ .no-bad-table-wrap .td.rowspan {
display: flex;
align-items: center;
justify-content: center;
}
/deep/ .div-table-head .thead .tr view {
width: 186rpx !important;
}
/deep/ no-bad-table {
overflow-x: hidden;
}
/deep/ .no-bad-table-wrap .thead .tr .td {
background-color: #7ba746;
color: white;
}
/deep/ .no-bad-table-wrap .thead .tr .td .td_wrap {
background-color: #7ba746;
color: white;
}
</style>