初步联调装表

This commit is contained in:
2025-11-03 16:26:30 +08:00
parent fe590353df
commit 1539304999
35 changed files with 1495 additions and 100 deletions

View File

@@ -42,7 +42,11 @@
"pages/workBenchNew/components/workBenchTenement/index",
"pages/workBenchNew/components/workBenchApprove/index",
"pages/workBenchNew/components/workBenchWxUser/index",
"pages/workBenchNew/components/workBenchReading/index"
"pages/workBenchNew/components/workBenchReading/index",
"pages/workBenchNew/components/recharge/index",
"pages/workBenchNew/components/installMeter/index",
"pages/workBenchNew/components/uninstallMeter/index",
"pages/workBenchTodoList/index"
],
"subPackages": [
{

View File

@@ -1,8 +1,8 @@
import { getLoginParkList, getParkBuildingList } from "../../service/park"
import { getParkSimpleMeterList } from "../../service/meter"
import { getParkSimpleMeterList, getParkBoxList, getCardList, getCollectionList, getInventoryMeter } from "../../service/meter"
import { alertInfo } from "../../utils/index";
import request from "../../utils/request"
import { payWays, feeType } from "../../utils/data";
import { payWays, feeType, meterType } from "../../utils/data";
import { getTenementList, getWxTenementList } from "../../service/tenement";
const { OK } = request;
@@ -35,6 +35,7 @@ Component({
searchText: "",
payWays,
feeType,
meterType
},
lifetimes: {
attached() {
@@ -96,6 +97,17 @@ Component({
})
this.triggerEvent("confirm", { data: item, way: index, type } );
},
onMeterTypeConfirm(event) {
const { index } = event.detail;
const { meterType = [], type } = this.data;
const item = meterType[index];
this.setData({
columns: [],
list: [],
searchText: ""
})
this.triggerEvent("confirm", { data: item, way: index, type } );
},
onSearch() {
const { type, bind, filterBind } = this.data;
switch(type) {
@@ -105,12 +117,24 @@ Component({
case "meter":
this.onSearchMeter();
return
case "inventoryMeter":
this.onSearchInventoryMeter();
return
case "tenement":
this.onSearchTenement();
return;
case "building":
this.onSearchBuilding();
return;
case "meterBox":
this.onSearchMeterBox();
return;
case "card":
this.onSearchCard();
return;
case "collection":
this.onSearchCollection();
return;
}
},
async onSearchPark() {
@@ -125,6 +149,18 @@ Component({
list: parks,
})
},
async onSearchCollection() {
const { searchText = "" } = this.data;
const { code, message, data: parks = [] } = await getCollectionList({keyword: searchText, page: 1});
if (code !== OK) {
alertInfo(message)
return
}
this.setData({
columns: parks?.map(item => item?.name),
list: parks,
})
},
async onSearchMeter() {
const { searchText = "", park, filterBind } = this.data;
const { code, message, data: parks = [] } = await getParkSimpleMeterList({keyword: searchText, park, isNeedBind: !filterBind});
@@ -137,6 +173,18 @@ Component({
list: parks || [],
})
},
async onSearchInventoryMeter() {
const { searchText = "", park, filterBind } = this.data;
const { code, message, data: parks = [] } = await getInventoryMeter({keyword: searchText, park, isNeedBind: !filterBind});
if (code !== OK) {
alertInfo(message)
return
}
this.setData({
columns: parks?.map(item => `${item.sn}`) || [],
list: parks || [],
})
},
async onSearchTenement() {
const { searchText = "", park, isBack } = this.data;
const { code, message, data = [] } = isBack ? await getWxTenementList({keyword: searchText, park}) : await getTenementList({keyword: searchText, park});
@@ -161,6 +209,30 @@ Component({
list: data,
})
},
async onSearchMeterBox() {
const { park } = this.data;
const { code, message, data = [] } = await getParkBoxList({park});
if (code !== OK) {
alertInfo(message)
return
}
this.setData({
columns: data?.length ? data?.map(item => item?.address) : [],
list: data,
})
},
async onSearchCard() {
const { park } = this.data;
const { code, message, data = [] } = await getCardList({park});
if (code !== OK) {
alertInfo(message)
return
}
this.setData({
columns: data?.length ? data?.map(item => item?.sim_number) : [],
list: data,
})
}
}
})

View File

@@ -26,6 +26,16 @@
bind:confirm="onFeeTypeConfirm"
/>
</view>
<view wx:elif="{{type === 'meterType'}}">
<van-picker
custom-style="width: 100%;"
columns="{{ meterType }}"
title="{{title}}"
show-toolbar="{{true}}"
bind:cancel="onCancel"
bind:confirm="onMeterTypeConfirm"
/>
</view>
<view wx:elif="{{type !== 'pay'}}">
<van-search
value="{{ value }}"

View File

@@ -15,7 +15,10 @@ Component({
type: {
type: String,
value: "select"
}
},
useSlot: Boolean,
hideBorder: Boolean,
required: Boolean,
},
/**
@@ -38,6 +41,7 @@ Component({
},
onChangeText(e) {
this.setData({ text: e.detail });
console.log("----------")
this.triggerEvent("changeText", e.detail)
},
onSearchKeyword() {

View File

@@ -1,6 +1,6 @@
<!--components/searchSelectWrapper/index.wxml-->
<view class="wrapper" wx:if="{{type === 'select'}}">
<view class="label"> {{ label }} </view>
<view class="label"><text class="required" wx:if="{{required}}">*</text>{{ label }}</view>
<view class="content" bind:tap="clickTime" bind:tap="onSearch">
<view class="text" wx:if="{{!text}}" style="color: #ccc;"> {{placeholder}} </view>
<view class="text" wx:else> {{text}} </view>
@@ -33,3 +33,10 @@
/>
</view>
</view>
<view class="wrapper" wx:if="{{useSlot}}">
<view class="label"> {{ label }} </view>
<view class="inputContent" bind:tap="clickTime" style="{{hideBorder ? 'border: none;' : ''}}">
<slot></slot>
</view>
</view>

View File

@@ -8,7 +8,7 @@
.content {
flex: 1;
margin-left: 30rpx;
margin-left: 20rpx;
margin-right: 30rpx;
display: flex;
padding: 10rpx 20rpx;
@@ -19,7 +19,7 @@
.inputContent {
flex: 1;
margin-left: 30rpx;
margin-left: 20rpx;
margin-right: 30rpx;
display: flex;
padding: 0 20rpx;
@@ -33,5 +33,10 @@
}
.label {
width: 120rpx;
width: 130rpx;
}
.required {
color: rgb(209, 83, 25);
font-size: 30rpx;
}

View File

@@ -0,0 +1,379 @@
// pages/workBenchNew/components/createMeter/index.js
import dayjs from "../../../../utils/dayjs"
import { alertInfo, alertSuccess, loadingFunc } from "../../../../utils/index"
import { uploadInstallMeter } from "../../../../service/public"
import request from "../../../../utils/request"
import { installMeter } from "../../../../service/meter"
const { OK } = request
Page({
/**
* 页面的初始数据
*/
data: {
time: "",
area: "",
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
this.setData({
time: dayjs().format("YYYY-MM-DD HH:mm:ss")
})
},
onParkFocus(e) {
this.setData({
show: true,
title: "园区",
type: 'park'
})
},
onMeterFocus(e) {
const { park } = this.data;
if (!park) {
alertInfo("请先选择园区")
return;
}
this.setData({
show: true,
title: "电表",
type: 'inventoryMeter'
})
},
onBuildingFocus() {
const { park } = this.data;
if (!park) {
alertInfo("请先选择园区")
return;
}
this.setData({
show: true,
title: "建筑",
type: 'building'
})
},
clearImage() {
this.setData({
url: ""
})
},
onMeterBoxFocus() {
const { park } = this.data;
if (!park) {
alertInfo("请先选择园区")
return;
}
this.setData({
show: true,
title: "电表箱",
type: 'meterBox'
})
},
onMeterTypeFocus() {
this.setData({
show: true,
title: "电表类型",
type: 'meterType'
})
},
onBindCard() {
const { park } = this.data;
if (!park) {
alertInfo("请先选择园区")
return;
}
this.setData({
show: true,
title: "卡",
type: 'card'
})
},
onBindCollectionA() {
const { park } = this.data;
if (!park) {
alertInfo("请先选择园区")
return;
}
this.setData({
show: true,
title: "采集器A",
type: 'collection',
collection: "A"
})
},
onBindCollectionB() {
const { park } = this.data;
if (!park) {
alertInfo("请先选择园区")
return;
}
this.setData({
show: true,
title: "采集器B",
type: 'collection',
collection: "B"
})
},
onBindCollectionC() {
const { park } = this.data;
if (!park) {
alertInfo("请先选择园区")
return;
}
this.setData({
show: true,
title: "采集器C",
type: 'collection',
collection: "C"
})
},
uploadImage() {
const that = this;
wx.chooseMedia({
count: 1,
mediaType: ['image'],
sourceType: ['album', 'camera'],
success: async function(res) {
console.log("res", res)
const path = res.tempFiles?.[0]?.tempFilePath.toLowerCase()
if (!/(\.jpg|\.png|\.jpeg)$/.test(path)) {
wx.showToast({
title: '请上传jpg、png或jpeg格式的图片',
icon: 'none',
});
return;
}
var tempFilePaths = path;
loadingFunc(async () => {
const { code, message, url } = await uploadInstallMeter(tempFilePaths)
if (code !== OK) {
alertError(message)
return
}
that.setData({
url: url
})
})
}
})
},
onConfirm(e) {
const { type, data = {} } = e.detail;
const {collection} = this.data;
switch(type) {
case "park":
this.setData({
park: data.id,
parkName: data.name,
})
break;
case "tenement":
this.setData({
tenement: data.id,
tenementName: data.name,
})
break;
case "inventoryMeter":
this.setData({
meter: data.id,
meterName: data?.sn,
})
break;
case "building":
this.setData({
building: data.id,
buildingName: data.name,
});
break;
case "meterBox":
this.setData({
meterBox: data.id,
meterBoxName: data.address,
});
break;
case "tenement":
this.setData({
tenement: data.id,
tenementName: data.name,
})
break;
case "meterType":
this.setData({
meterType: data.way,
meterTypeName: data,
});
break;
case "meter":
this.setData({
meter: data.id,
meterName: data.address,
});
break;
case "card":
this.setData({
card: data.id,
cardName: data.sim_number,
});
break;
case "collection":
let newData = {}
if (collection === "A") {
newData = {
collectionA: data.id,
collectionAName: data.name,
}
}
if (collection === "B") {
newData = {
collectionB: data.id,
collectionBName: data.name,
}
}
if (collection === "C") {
newData = {
collectionC: data.id,
collectionCName: data.name,
}
}
this.setData(newData);
break;
}
this.onCancel();
},
changeAddress(e) {
this.setData({
address: e.detail
})
},
changeArea(e) {
this.setData({
area: e.detail
})
},
changeOverall(e) {
this.setData({
overall: e.detail
})
},
changeSharp(e) {
this.setData({
sharp: e.detail
})
},
changePeak(e) {
this.setData({
sharp: e.detail
})
},
changeFlat(e) {
this.setData({
flat: e.detail
})
},
changeValley(e) {
this.setData({
valley: e.detail
})
},
changeRatio(e) {
this.setData({
ratio: e.detail,
})
},
onCancel() {
this.setData({
show: false,
title: "",
type: "",
})
},
onTenementFocus(e) {
const { park } = this.data;
const that = this;
if (!park) {
alertInfo("请先选择园区")
return;
}
this.setData({
show: true,
title: "商户",
type: 'tenement'
})
},
async handleSubmit() {
const {
park, meter, address, building, meterBox, meterType,
ratio, area, card, collectionA, collectionB, collectionC,
tenement, sharp, peak, flat, valley, overall, url
} = this.data;
if (!park || !meter || !address) {
alertInfo("请填写必填项后保存")
return;
}
console.log("data", this.data)
const { code, data, message } = await installMeter({
park, meter, address, building, meterBox, meterType,
ratio, area, card, collectionA, collectionB, collectionC,
tenement, sharp, peak, flat, valley, overall, url
})
if (code !== OK) {
alertInfo(message)
return;
}
alertSuccess("新增成功")
},
goback() {
wx.navigateBack()
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})

View File

@@ -0,0 +1,12 @@
{
"usingComponents": {
"navigator": "/components/navigator/index",
"van-popup": "@vant/weapp/popup/index",
"search-select": "/components/searchSelect/index",
"van-field": "@vant/weapp/field/index",
"van-button": "@vant/weapp/button/index",
"van-image": "@vant/weapp/image/index",
"searchSelectWrapper": "/components/searchSelectWrapper/index"
},
"navigationStyle": "custom"
}

View File

@@ -0,0 +1,181 @@
<!--pages/workBenchNew/components/createMeter/index.wxml-->
<navigator canBack="{{true}}" title="新装电表" />
<view class="wrapper">
<searchSelectWrapper
label="当前时间"
placeholder="请选择园区"
useSlot
type=""
hideBorder="{{true}}"
>
<view> {{time}} </view>
</searchSelectWrapper>
<searchSelectWrapper
label="选择园区"
placeholder="请选择园区"
text="{{parkName}}"
bind:search="onParkFocus"
required="{{true}}"
/>
<searchSelectWrapper
label="选择电表"
placeholder="请选择电表"
text="{{meterName}}"
bind:search="onMeterFocus"
required="{{true}}"
/>
<searchSelectWrapper
label="选择建筑"
placeholder="请选择建筑"
text="{{buildingName}}"
bind:search="onBuildingFocus"
/>
<searchSelectWrapper
label="电表箱"
placeholder="请选择电表箱"
text="{{meterBoxName}}"
bind:search="onMeterBoxFocus"
/>
<searchSelectWrapper
label="电表类型"
placeholder="请选择电表类型"
text="{{meterTypeName}}"
bind:search="onMeterTypeFocus"
required="{{true}}"
/>
<searchSelectWrapper
label="倍率"
placeholder="请输入倍率"
type="input"
text="ratio"
bind:changeText="changeRatio"
/>
<searchSelectWrapper
label="电表地址"
placeholder="请输入电表地址"
text="area"
type="input"
required="{{true}}"
bind:changeText="changeAddress"
/>
<searchSelectWrapper
label="所辖面积"
placeholder="请输入所辖面积"
text="area"
type="input"
bind:changeText="changeArea"
/>
<searchSelectWrapper
label="绑定卡"
placeholder="请选择卡绑定(选填)"
text="{{cardName}}"
bind:search="onBindCard"
/>
<searchSelectWrapper
label="采集器A"
placeholder="请选择采集器绑定(选填)"
text="{{collectionA}}"
bind:search="onBindCollectionA"
/>
<searchSelectWrapper
label="采集器B"
placeholder="请选择采集器绑定(选填)"
text="{{collectionB}}"
bind:search="onBindCollectionB"
/>
<searchSelectWrapper
label="采集器C"
placeholder="请选择采集器绑定(选填)"
text="{{collectionC}}"
bind:search="onBindCollectionC"
/>
<searchSelectWrapper
label="商户"
placeholder="请选择商户"
text="{{ tenementName }}"
bind:search="onTenementFocus"
/>
<searchSelectWrapper
label="总"
placeholder="请输入总"
type="input"
bind:changeText="changeOverall"
/>
<searchSelectWrapper
label="尖"
placeholder="请输入尖"
type="input"
bind:changeText="changeSharp"
/>
<searchSelectWrapper
label="峰"
placeholder="请输入峰"
type="input"
bind:changeText="changePeak"
/>
<searchSelectWrapper
label="平"
placeholder="请输入平"
type="input"
bind:changeText="changeFlat"
/>
<searchSelectWrapper
label="谷"
placeholder="请输入谷"
type="input"
bind:changeText="changeValley"
/>
<searchSelectWrapper
label="图片"
useSlot="{{true}}"
type=""
hideBorder="{{true}}"
>
<view style="display: flex; align-items: center;">
<view>
<van-button type="info" size="small" bind:click="uploadImage" custom-style="margin-right: 20rpx;"> 上传 </van-button>
<view style="margin-top: 20rpx" wx:if="{{!!url}}">
<van-button type="danger" size="small" bind:click="clearImage" custom-style="margin-right: 20rpx;"> 清除 </van-button>
</view>
</view>
<van-image wx:if="{{!!url}}" width="100" height="100" src="{{url}}" custom-style="margin-left: 20rpx;" />
</view>
</searchSelectWrapper>
<view class="operate">
<view class="submit"> <van-button type="info" block bind:click="handleSubmit"> 提交 </van-button> </view>
<view class="cancel"> <van-button block bind:tap="goback"> 返回 </van-button> </view>
</view>
</view>
<search-select
show="{{show}}"
title="{{title}}"
type="{{type}}"
park="{{park}}"
bindconfirm="onConfirm"
bindcancel="onCancel"
wx:if="{{show}}"
/>
<van-popup
show="{{ imageShow }}"
bind:close="onClose"
z-index="99999"
>
<van-image
width="100vw"
height="99.1vh"
fit="contain"
src="{{url}}"
bind:click="onClose"
/>
</van-popup>

View File

@@ -0,0 +1,15 @@
/* pages/workBenchNew/components/createMeter/index.wxss */
.operate {
display: flex;
padding-top: 24rpx;
padding-bottom: 36rpx;
}
.submit, .cancel {
flex: 1;
}
.submit {
margin-right: 30rpx;
}

View File

@@ -0,0 +1,27 @@
// pages/workBenchNew/components/operateButton/index.js
Component({
/**
* 组件的属性列表
*/
properties: {
text: String,
style: String,
},
/**
* 组件的初始数据
*/
data: {
},
/**
* 组件的方法列表
*/
methods: {
handleClick() {
this.triggerEvent("click")
}
}
})

View File

@@ -0,0 +1,4 @@
{
"component": true,
"usingComponents": {}
}

View File

@@ -0,0 +1,2 @@
<!--pages/workBenchNew/components/operateButton/index.wxml-->
<view class="buttonWrapper" style="{{style}}" bind:tap="handleClick"> {{ text }} </view>

View File

@@ -0,0 +1,12 @@
/* pages/workBenchNew/components/operateButton/index.wxss */
.buttonWrapper {
height: 100rpx;
display: flex;
justify-content: center;
align-items: center;
border: 1rpx solid #ccc;
border-radius: 10rpx;
margin-bottom: 24rpx;
margin-top: 24rpx;
}

View File

@@ -0,0 +1,192 @@
// pages/workBenchNew/components/recharge/index.js
import { handleRecharge } from "../../../../service/recharge";
import { alertInfo, alertSuccess, loadingFunc } from "../../../../utils/index";
import request from '../../../../utils/request'
const { OK } = request;
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
onParkFocus() {
this.setData({
show: true,
title: "园区",
type: 'park'
})
},
onMeterFocus() {
const { park } = this.data;
if (!park) {
alertInfo("请先选择园区")
return;
}
this.setData({
show: true,
title: "电表",
type: 'meter'
})
},
onConfirm(e) {
const { data, type, way } = e.detail;
switch(type) {
case "park":
this.setData({
parkName: data.name,
park: data.id,
})
break;
case "meter":
this.setData({
meterName: `${data.meterNo}-${data.address}${data.tenement?.name ? '-' + data.tenement?.name : ''}`,
meter: data.id,
})
break;
case "pay":
this.setData({
payName: data,
way: way,
});
break;
}
this.onCancel();
},
onCancel() {
this.setData({
show: false,
title: "",
type: "",
})
},
onPayFocus() {
this.setData({
show: true,
title: "付款方式",
type: 'pay'
})
},
onChangeMoney(e) {
this.setData({ money: e.detail })
},
onChangeVoucherNo(e) {
this.setData({ voucherNo: e.detail })
},
handleClear() {
this.setData({
park: "",
parkName: "",
meter: "",
meterName: "",
way: "",
payName: "",
show: false,
title: "",
type: "",
money: null,
voucherNo: null
})
},
async handleSubmit() {
const that = this;
const { park, meter, money, way, voucherNo } = this.data;
if (!park) {
alertInfo("请选择园区");
return;
}
if (!meter) {
alertInfo("请选择电表")
return;
}
if (!money) {
alertInfo("请输入金额")
return
}
if (!way && way !== 0) {
alertInfo("请选择付款方式")
return
}
if (!voucherNo) {
alertInfo("请输入凭证号")
return
}
loadingFunc(async () => {
const { code, message } = await handleRecharge(park, {
amount: `${money || ''}`,
meter,
paymentType: way,
voucherNo,
type: 0
})
if (code !== OK) {
alertInfo(message)
return
}
alertSuccess("充值成功")
setTimeout(() => {
that.handleClear()
that.setData({
})
}, 500)
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})

View File

@@ -0,0 +1,11 @@
{
"usingComponents": {
"van-popup": "@vant/weapp/popup/index",
"search-select": "/components/searchSelect/index",
"van-field": "@vant/weapp/field/index",
"van-button": "@vant/weapp/button/index",
"searchSelectWrapper": "/components/searchSelectWrapper/index",
"navigator": "/components/navigator"
},
"navigationStyle": "custom"
}

View File

@@ -0,0 +1,51 @@
<!--pages/workBenchNew/components/recharge/index.wxml-->
<navigator canBack="{{true}}" title="充值" />
<van-cell-group>
<searchSelectWrapper
label="园区"
placeholder="请选择园区"
text="{{parkName}}"
bind:search="onParkFocus"
/>
<searchSelectWrapper
label="电表"
placeholder="请选择电表"
text="{{meterName}}"
bind:search="onMeterFocus"
/>
<searchSelectWrapper
label="金额"
placeholder="请输入金额"
text="{{meterName}}"
fieldType="number"
type="input"
bind:changeText="onChangeMoney"
/>
<searchSelectWrapper
label="付款方式"
placeholder="请选择付款方式"
text="{{payName}}"
bind:search="onPayFocus"
/>
<searchSelectWrapper
label="凭证"
placeholder="请输入凭证"
type="input"
bind:changeText="onChangeVoucherNo"
/>
</van-cell-group>
<view style="margin-top: 60rpx;display: flex; justify-content: center; align-items: center;">
<van-button type="info" size="small" style="margin-right: 30rpx;" bind:click="handleSubmit"> 确认 </van-button>
<van-button size="small" bind:click="handleClear"> 清空 </van-button>
</view>
<search-select
show="{{show}}"
title="{{title}}"
type="{{type}}"
park="{{park}}"
bindconfirm="onConfirm"
bindcancel="onCancel"
wx:if="{{show}}"
/>

View File

@@ -0,0 +1 @@
/* pages/workBenchNew/components/recharge/index.wxss */

View File

@@ -0,0 +1,173 @@
// pages/workBenchNew/components/uninstallMeter/index.js
import dayjs from "../../../../utils/dayjs"
import { alertInfo, } from "../../../../utils/index"
Page({
/**
* 页面的初始数据
*/
data: {
},
onParkFocus(e) {
this.setData({
show: true,
title: "园区",
type: 'park'
})
},
onMeterFocus(e) {
const { park } = this.data;
if (!park) {
alertInfo("请先选择园区")
return;
}
this.setData({
show: true,
title: "电表",
type: 'meter'
})
},
onConfirm(e) {
const { type, data = {} } = e.detail;
const {collection} = this.data;
switch(type) {
case "park":
this.setData({
park: data.id,
parkName: data.name,
})
break;
case "tenement":
this.setData({
tenement: data.id,
tenementName: data.name,
})
break;
case "building":
this.setData({
building: data.id,
buildingName: data.name,
});
break;
case "meterBox":
this.setData({
meterBox: data.id,
meterBoxName: data.address,
});
break;
case "meterType":
this.setData({
meterType: data.way,
meterTypeName: data,
});
break;
case "meter":
this.setData({
meter: data.id,
meterName: data.address,
});
break;
case "card":
this.setData({
card: data.id,
cardName: data.sim_number,
});
break;
case "collection":
let newData = {}
if (collection === "A") {
newData = {
collectionA: data.id,
collectionAName: data.name,
}
}
if (collection === "B") {
newData = {
collectionB: data.id,
collectionBName: data.name,
}
}
if (collection === "C") {
newData = {
collectionC: data.id,
collectionCName: data.name,
}
}
this.setData(newData);
break;
}
this.onCancel();
},
onCancel() {
this.setData({
show: false,
title: "",
type: "",
})
},
goback() {
wx.navigateBack()
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
this.setData({
time: dayjs().format("YYYY-MM-DD HH:mm:ss")
})
},
changeReason(e) {
this.setData({
reason: e.detail,
})
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})

View File

@@ -0,0 +1,11 @@
{
"usingComponents": {
"navigator": "/components/navigator/index",
"van-popup": "@vant/weapp/popup/index",
"search-select": "/components/searchSelect/index",
"van-field": "@vant/weapp/field/index",
"van-button": "@vant/weapp/button/index",
"searchSelectWrapper": "/components/searchSelectWrapper/index"
},
"navigationStyle": "custom"
}

View File

@@ -0,0 +1,75 @@
<!--pages/workBenchNew/components/uninstallMeter/index.wxml-->
<navigator canBack="{{true}}" title="拆表" />
<view class="wrapper">
<searchSelectWrapper
label="当前时间"
placeholder="请选择园区"
useSlot
type=""
hideBorder="{{true}}"
>
<view> {{time}} </view>
</searchSelectWrapper>
<searchSelectWrapper
label="选择园区"
placeholder="请选择园区"
text="{{parkName}}"
bind:search="onParkFocus"
required="{{true}}"
/>
<searchSelectWrapper
label="选择电表"
placeholder="请选择电表"
text="{{meterName}}"
bind:search="onMeterFocus"
required="{{true}}"
/>
<searchSelectWrapper
label="原因"
placeholder="请输入原因"
text="reason"
type="input"
bind:changeText="changeReason"
/>
<searchSelectWrapper
label="图片"
useSlot="{{true}}"
type=""
hideBorder="{{true}}"
>
<van-button wx:if="{{!image}}" type="info" size="small"> 上传 </van-button>
</searchSelectWrapper>
<view class="operate">
<view class="submit"> <van-button type="info" block> 提交 </van-button> </view>
<view class="cancel"> <van-button block bind:tap="goback"> 返回 </van-button> </view>
</view>
</view>
<search-select
show="{{show}}"
title="{{title}}"
type="{{type}}"
park="{{park}}"
bindconfirm="onConfirm"
bindcancel="onCancel"
wx:if="{{show}}"
/>
<van-popup
show="{{ imageShow }}"
bind:close="onClose"
z-index="99999"
>
<van-image
width="100vw"
height="99.1vh"
fit="contain"
src="{{url}}"
bind:click="onClose"
/>
</van-popup>

View File

@@ -0,0 +1,15 @@
/* pages/workBenchNew/components/uninstallMeter/index.wxss */
.operate {
display: flex;
padding-top: 24rpx;
padding-bottom: 36rpx;
}
.submit, .cancel {
flex: 1;
}
.submit {
margin-right: 30rpx;
}

View File

@@ -1,17 +1,14 @@
<!--pages/workBench/components/recharge/index.wxml-->
<navigator title="充值审核" canBack="{{true}}" />
<view style="">
<view>
<view class="typeQuery">
<van-row>
<van-col span="8">
<van-col span="12">
<view class="typeQueryText" style="color: {{active === 0 ? '#0958d9' : '#000'}}" bind:tap="changeQueryType" data-type="{{0}}"> 待审核 </view>
</van-col>
<van-col span="8">
<van-col span="12">
<view class="typeQueryText" style="color: {{active === 1 ? '#0958d9' : '#000'}}" bind:tap="changeQueryType" data-type="{{1}}"> 已审核 </view>
</van-col>
<van-col span="8">
<view class="typeQueryText" style="color: {{active === 2 ? '#0958d9' : '#000'}}" bind:tap="changeQueryType" data-type="{{2}}"> 充值 </view>
</van-col>
</van-row>
</view>
</view>

View File

@@ -61,6 +61,21 @@ Page({
url: '/pages/home/index',
})
},
jumpToRecharge() {
wx.navigateTo({
url: '/pages/workBenchNew/components/recharge/index',
})
},
jumpToInstallMeter() {
wx.navigateTo({
url: '/pages/workBenchNew/components/installMeter/index',
})
},
jumpToUninstallMeter() {
wx.navigateTo({
url: '/pages/workBenchNew/components/uninstallMeter/index',
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/

View File

@@ -3,7 +3,8 @@
"navigator": "/components/navigator/index",
"van-row": "@vant/weapp/row/index",
"van-col": "@vant/weapp/col/index",
"van-button": "@vant/weapp/button/index"
"van-button": "@vant/weapp/button/index",
"operate-button": "./components/operateButton/index"
},
"navigationStyle": "custom"
}

View File

@@ -2,7 +2,7 @@
<navigator title="工作台" canBack="{{false}}" />
<view class="wrapper">
<van-row gutter="10">
<!-- <van-row gutter="10">
<van-col span="12">
<view class="contentWrapper" bind:tap="jumpToMeter">
<view class="image">
@@ -73,7 +73,62 @@
</view>
</view>
</van-col>
</van-row> -->
<view>
<view> 通用操作 </view>
<view>
<van-row gutter="10">
<van-col span="8">
<operate-button text="充值" bind:click="jumpToRecharge" />
</van-col>
<van-col span="8">
<operate-button text="充值审核" bind:click="jumpToPay" />
</van-col>
<van-col span="8">
<operate-button text="其他审核" />
</van-col>
<van-col span="8">
<operate-button text="电表操作" bind:click="jumpToMeter" />
</van-col>
<van-col span="8">
<operate-button text="商户操作" bind:click="jumpToTenement" />
</van-col>
<van-col span="8">
<operate-button text="C端账号" bind:click="jumpToWxUser" />
</van-col>
</van-row>
</view>
<view> 现场操作 </view>
<view>
<van-row gutter="10">
<van-col span="8">
<operate-button text="抄表" bind:click="jumpToRoute" />
</van-col>
<van-col span="8">
<operate-button text="拆表" bind:click="jumpToUninstallMeter" />
</van-col>
<van-col span="8">
<operate-button text="新装" bind:click="jumpToInstallMeter" />
</van-col>
<van-col span="8">
<operate-button text="开户" />
</van-col>
<van-col span="8">
<operate-button text="销户" />
</van-col>
<van-col span="8">
<operate-button text="强控" />
</van-col>
</van-row>
</view>
</view>
<view class="operate">
<van-button type="info" block bind:click="jumpToHome"> 回到首页 </van-button>
</view>

View File

@@ -0,0 +1,66 @@
// pages/workBenchTodoList/index.js
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})

View File

@@ -0,0 +1,13 @@
{
"usingComponents": {
"navigator": "/components/navigator/index",
"van-popup": "@vant/weapp/popup/index",
"van-row": "@vant/weapp/row/index",
"van-col": "@vant/weapp/col/index",
"search-select": "/components/searchSelect/index",
"van-field": "@vant/weapp/field/index",
"van-button": "@vant/weapp/button/index",
"searchSelectWrapper": "/components/searchSelectWrapper/index"
},
"navigationStyle": "custom"
}

View File

@@ -0,0 +1,12 @@
<!--pages/workBenchTodoList/index.wxml-->
<navigator canBack="{{true}}" title="工单列表" />
<view class="wrapper">
<van-row gutter="20">
<van-col span="12">
1
</van-col>
<van-col span="12">
2
</van-col>
</van-row>
</view>

View File

@@ -0,0 +1 @@
/* pages/workBenchTodoList/index.wxss */

View File

@@ -24,22 +24,15 @@
"miniprogram": {
"list": [
{
"name": "pages/readingHistory/index",
"pathName": "pages/readingHistory/index",
"query": "meter=METER00114674412879874&park=P00114672412196865&routeId=PR00121172392214529&disabled=false",
"launchMode": "default",
"scene": null
},
{
"name": "pages/workBenchNew/components/workBenchTenement/index",
"pathName": "pages/workBenchNew/components/workBenchTenement/index",
"name": "pages/workBenchTodoList/index",
"pathName": "pages/workBenchTodoList/index",
"query": "",
"launchMode": "default",
"scene": null
},
{
"name": "pages/workBenchNew/components/workBenchReading/index",
"pathName": "pages/workBenchNew/components/workBenchReading/index",
"name": "pages/workBenchNew/components/uninstallMeter/index",
"pathName": "pages/workBenchNew/components/uninstallMeter/index",
"query": "",
"launchMode": "default",
"scene": null
@@ -50,76 +43,6 @@
"query": "",
"launchMode": "default",
"scene": null
},
{
"name": "pages/writeReading/index",
"pathName": "pages/writeReading/index",
"query": "id=PR00118027286020097",
"launchMode": "default",
"scene": null
},
{
"name": "pages/readingHistory/index",
"pathName": "pages/readingHistory/index",
"query": "",
"launchMode": "default",
"scene": null
},
{
"name": "pages/workBench/index",
"pathName": "pages/workBench/index",
"query": "",
"launchMode": "default",
"scene": null
},
{
"name": "pages/workBench/index",
"pathName": "pages/workBench/index",
"query": "",
"launchMode": "default",
"scene": null
},
{
"name": "childPackage/pages/electricQuery/index",
"pathName": "childPackage/pages/electricQuery/index",
"query": "",
"launchMode": "default",
"scene": null
},
{
"name": "pages/workBench/index",
"pathName": "pages/workBench/index",
"query": "",
"launchMode": "default",
"scene": null
},
{
"name": "childPackage/pages/electricQuery/index",
"pathName": "childPackage/pages/electricQuery/index",
"query": "",
"launchMode": "default",
"scene": null
},
{
"name": "pages/workBench/index",
"pathName": "pages/workBench/index",
"query": "",
"launchMode": "default",
"scene": null
},
{
"name": "childPackage/pages/electricQuery/index",
"pathName": "childPackage/pages/electricQuery/index",
"query": "",
"launchMode": "default",
"scene": null
},
{
"name": "childPackage/pages/electricQuery/index",
"pathName": "childPackage/pages/electricQuery/index",
"query": "",
"launchMode": "default",
"scene": null
}
]
}

View File

@@ -41,3 +41,30 @@ export const handleOperateMeterSwitch = async function({ ids = [], status }) {
export const getWorkMeterDetail = async function(code = '') {
return await GET(`/vx/getWorkMeterDetail?code=${code}`);
}
// 获取某一园区下的电表箱列表
export const getParkBoxList = async function({park = "", keyword = "", page = 1}) {
return await GET(`/box/${park}?page=${page}&keyword=${replaceSpecialIcon(keyword)}`);
}
// 获取卡列表
export const getCardList = async function({park = "", keyword = "", page = 1}) {
return await GET(`/equipment/getCardList?page=${page}&park=${park}&keyword=${replaceSpecialIcon(keyword)}`);
}
// 获取互感器列表
export const getCollectionList = async function({park = "", keyword = "", page = 1}) {
return await GET(`/transformer/list/select?page=${page}&park=${park}&transformerId=${replaceSpecialIcon(keyword)}`);
}
// 获取库存电表列表
export const getInventoryMeter = async function({park = "", keyword = "", page = 1}) {
return await GET(`/electricity/list?page=${page}&park=${park}&keyword=${replaceSpecialIcon(keyword)}`);
}
// 新装电表
export const installMeter = async function(data) {
return await POST(`/wx/workBench/installMeter`, data);
}

View File

@@ -43,6 +43,26 @@ export const uploadOcrFile = (filePath) => {
})
}
export const uploadInstallMeter = (filePath) => {
const { api } = getConfigByEnv();
return new Promise((resolve, reject) => {
wx.uploadFile({
filePath: filePath,
name: 'data',
url: `${api}/image/meter/reading`,
header: {
authorization: 'Bearer ' + wx.getStorageSync("token")
},
success: (res) => {
resolve(res?.data ? JSON.parse(res?.data) : res?.data);
},
fail: (err) => {
reject(err);
}
})
})
}
export const uploadPublicFile = (filePath) => {
const { api } = getConfigByEnv();
return new Promise((resolve, reject) => {

View File

@@ -10,3 +10,5 @@ export const getRechargeOperateWay = (num) => {
}
export const feeType = ['华昌宝能收费', "物业代收1", "物业代收2", "物业代收线损"]
export const meterType = ['商户电表', '园区电表', '公摊电表']