Compare commits

...

29 Commits

Author SHA1 Message Date
2bb5a51031 充值和开票限定 2025-11-27 08:53:09 +08:00
990a3a17aa 工单支持点击列表进入详情,新装电表的适合根据电表类型显示商户和尖峰平谷,拆表的时候是商户表的时候二次提示 2025-11-21 16:25:43 +08:00
0ef96344ce 修改工单查询的问题 2025-11-19 10:58:16 +08:00
6fee2d0435 工单列表查询电表接口修改 2025-11-19 10:28:20 +08:00
972a267c36 修改工单详情不显示图片的问题 2025-11-19 08:48:21 +08:00
7a33dad81b 修改工单状态错误 2025-11-18 16:35:16 +08:00
51a50fcd8d 确认工单参数问题 2025-11-18 16:04:56 +08:00
4779cc1718 工单详情增加部分字段,装表新增采集器,修改工单列表查询的问题 2025-11-18 15:11:05 +08:00
c03d70b221 修改字符串格式的数字为“”的时候接口报错的问题和装表的时候未过滤已装电表的问题 2025-11-18 10:52:02 +08:00
3a1b7f5a2a 工单列表的确认放到状态 2025-11-17 17:02:45 +08:00
db1adea70a 装表的时候过滤已经选择的互感器 2025-11-17 15:51:41 +08:00
771bacdafa 电表箱支持按建筑筛选,倍率必填,拆表传id 2025-11-14 17:22:11 +08:00
f138fabce9 充值新增商户id 2025-11-14 14:23:28 +08:00
3259eb2465 修改工单问题 2025-11-14 14:17:57 +08:00
edfd386e1b 去除打印,抄表路线支持所有园区,支持部分选择框清除内容 2025-11-13 17:10:33 +08:00
d7d5366230 工单确认 2025-11-13 11:07:16 +08:00
496d7fb7d6 工单详情 2025-11-12 18:16:16 +08:00
1a6071194a 工单详情 2025-11-12 18:14:12 +08:00
b940d7a6cc 小程序工单联调 2025-11-12 17:35:23 +08:00
391219bde1 强控和装表字段调整 2025-11-12 15:38:00 +08:00
422338f816 电表强控,工单跳转 2025-11-12 14:12:01 +08:00
7271c982d5 处理冲突 2025-11-12 09:01:25 +08:00
e82ffd6bfc 支持深谷 2025-11-12 08:58:33 +08:00
8af3586e22 删掉注释 2025-11-12 08:56:43 +08:00
ed5fea105f 修改参数undefined的问题 2025-11-12 08:49:16 +08:00
48f35e2e91 拆表 2025-11-10 17:38:06 +08:00
07add88856 联调拆表 2025-11-10 16:09:38 +08:00
639f92540f 工作台代码提交 2025-11-09 17:33:32 +08:00
0d38e006e1 初步进行新装调试 2025-11-06 16:15:34 +08:00
57 changed files with 2304 additions and 180 deletions

View File

@@ -39,6 +39,7 @@
"pages/billMeterDetail/index",
"pages/meterBalanceRecord/index",
"pages/workBenchNew/components/workBenchMeter/index",
"pages/workBenchNew/components/workBenchMeterControl/index",
"pages/workBenchNew/components/workBenchTenement/index",
"pages/workBenchNew/components/workBenchApprove/index",
"pages/workBenchNew/components/workBenchWxUser/index",
@@ -46,7 +47,9 @@
"pages/workBenchNew/components/recharge/index",
"pages/workBenchNew/components/installMeter/index",
"pages/workBenchNew/components/uninstallMeter/index",
"pages/workBenchTodoList/index"
"pages/workBenchTodoList/index",
"pages/workBenchNew/components/kaihu/index",
"pages/workOrderDetail/index"
],
"subPackages": [
{

View File

@@ -129,6 +129,7 @@
<view class="colContentValue2">峰: {{ detail.comprehensive.peakAmount }} </view>
<view class="colContentValue2">平: {{ detail.comprehensive.flatAmount }} </view>
<view class="colContentValue2">谷: {{ detail.comprehensive.valleyAmount }} </view>
<view class="colContentValue2">深谷: {{ detail.comprehensive.deepValleyAmount }} </view>
</view>
</van-col>
<van-col span="12">
@@ -141,6 +142,7 @@
<view class="colContentValue2">峰: {{ detail.comprehensive.pricePeak }} </view>
<view class="colContentValue2">平: {{ detail.comprehensive.priceFlat }} </view>
<view class="colContentValue2">谷: {{ detail.comprehensive.priceValley }} </view>
<view class="colContentValue2">深谷: {{ detail.comprehensive.priceDeepValley }} </view>
</view>
</van-col>
</van-row>

View File

@@ -136,6 +136,13 @@
readonly
wx:if="{{park.meter04kvType === 1|| park.meter04kvType === 2}}"
/>
<van-field
value="{{ readingDetail.deepValley }}"
border="{{ false }}"
label="当前表字(深谷)"
readonly
wx:if="{{park.meter04kvType === 1|| park.meter04kvType === 2}}"
/>
<van-field
value="{{ readingDetail.valleyAmount }}"
border="{{ false }}"
@@ -143,6 +150,13 @@
readonly
wx:if="{{park.meter04kvType === 1|| park.meter04kvType === 2}}"
/>
<van-field
value="{{ readingDetail.deepValleyAmount }}"
border="{{ false }}"
label="深谷用电量"
readonly
wx:if="{{park.meter04kvType === 1|| park.meter04kvType === 2}}"
/>
<view class="text">上次抄表记录起,至现在时间内的用电量</view>
</van-cell-group>

View File

@@ -41,6 +41,7 @@ Page({
{ key: 'peak', title: '峰' },
{ key: 'flat', title: '平' },
{ key: 'valley', title: '谷' },
{ key: 'deepValley', title: '深谷' },
],
list: [],
visible: false,
@@ -171,7 +172,7 @@ Page({
const newList = [...times].map(item => {
const exist = list.find(ele => ele.time === item)
if (exist) {
return Number(exist.critical)+ Number(exist.peak)+Number(exist.flat)+Number(exist.valley);
return Number(exist.critical || 0)+ Number(exist.peak || 0)+Number(exist.flat || 0)+Number(exist.valley || 0)+Number(exist.deepValley || 0);
}
return null
})

View File

@@ -1,8 +1,15 @@
import { getLoginParkList, getParkBuildingList } from "../../service/park"
import { getParkSimpleMeterList, getParkBoxList, getCardList, getCollectionList, getInventoryMeter } from "../../service/meter"
import {
getParkSimpleMeterList, getParkBoxList,
getCardList, getCollectionList,
getInventoryMeter, getCollectorList,
getWorkOrderAllMeter,
} from "../../service/meter"
import { alertInfo } from "../../utils/index";
import request from "../../utils/request"
import { payWays, feeType, meterType } from "../../utils/data";
import { payWays, feeType, meterType, noticeFlowType, noticeFlowStatus,
meterMode
} from "../../utils/data";
import { getTenementList, getWxTenementList } from "../../service/tenement";
const { OK } = request;
@@ -17,8 +24,11 @@ Component({
type: String,
show: Boolean,
park: String,
building: String,
isBack: Boolean,
filterBind: Boolean,
filterData: Array,
filterType: String
},
observers: {
"show,type,filterBind": function(newShow, newType) {
@@ -35,7 +45,10 @@ Component({
searchText: "",
payWays,
feeType,
meterType
meterType,
noticeFlowType,
noticeFlowStatus,
meterMode,
},
lifetimes: {
attached() {
@@ -62,7 +75,6 @@ Component({
},
onConfirm(event) {
const { index } = event.detail;
console.log("index", index)
const { list = [], type } = this.data;
const item = list[index];
if (!item) {
@@ -76,6 +88,17 @@ Component({
})
this.triggerEvent("confirm", { data: item, type, index } );
},
onMeterModeConfirm(event) {
const { index } = event.detail;
const { meterMode = [], type } = this.data;
const item = meterMode[index];
this.setData({
columns: [],
list: [],
searchText: ""
})
this.triggerEvent("confirm", { data: item, way: index, type } );
},
onPayConfirm(event) {
const { index } = event.detail;
const { payWays = [], type } = this.data;
@@ -87,6 +110,28 @@ Component({
})
this.triggerEvent("confirm", { data: item, way: index, type } );
},
onNoticeFlowTypeConfirm(event) {
const { index } = event.detail;
const { noticeFlowType = [], type } = this.data;
const item = noticeFlowType[index];
this.setData({
columns: [],
list: [],
searchText: ""
})
this.triggerEvent("confirm", { data: item, way: index + 1, type } );
},
onNoticeFlowStatusConfirm(event) {
const { index } = event.detail;
const { noticeFlowStatus = [], type } = this.data;
const item = noticeFlowStatus[index];
this.setData({
columns: [],
list: [],
searchText: ""
})
this.triggerEvent("confirm", { data: item, way: index + 1, type } );
},
onFeeTypeConfirm(event) {
const { index } = event.detail;
const { feeType = [], type } = this.data;
@@ -136,8 +181,38 @@ Component({
case "collection":
this.onSearchCollection();
return;
case "collector":
this.onSearchCollector();
break;
case "workOrderMeter":
this.onSearchWorkOrderMeter();
break;
}
},
async onSearchCollector() {
const { searchText = "", } = this.data;
const { code, message, data = [] } = await getCollectorList(searchText);
if (code !== OK) {
alertInfo(message)
return
}
this.setData({
columns: data?.map(item => `${item.collectorAddress}-${item.manufacturer}`),
list: data,
})
},
async onSearchWorkOrderMeter() {
const { searchText = "", park } = this.data;
const { code, message, data = [] } = await getWorkOrderAllMeter({keyword: searchText, park: park, page: 1, size: 20});
if (code !== OK) {
alertInfo(message)
return
}
this.setData({
columns: data?.map(item => `${item.address}-${item.meter_no}`),
list: data,
})
},
async onSearchPark() {
const { searchText = "" } = this.data;
const { code, message, data: parks = [] } = await getLoginParkList({keyword: searchText});
@@ -151,15 +226,21 @@ Component({
})
},
async onSearchCollection() {
const { searchText = "" } = this.data;
const { code, message, data: parks = [] } = await getCollectionList({keyword: searchText, page: 1});
const { searchText = "", filterData, filterType } = this.data;
const { code, message, data: parks = [] } = await getCollectionList({keyword: searchText, page: 1, status: 1});
if (code !== OK) {
alertInfo(message)
return
}
let columns = parks;
if (filterType === 'collection') {
columns = columns.filter(item => {
return !filterData.includes(item.id)
})
}
this.setData({
columns: parks?.map(item => `${item.transformerId}-倍率:${item.ratio}-${item.manufacturer}`),
list: parks,
columns: columns?.map(item => `${item.transformerId}-倍率:${item.ratio}-${item.manufacturer}`),
list: columns,
})
},
async onSearchMeter() {
@@ -176,7 +257,7 @@ Component({
},
async onSearchInventoryMeter() {
const { searchText = "", park, filterBind } = this.data;
const { code, message, data: parks = [] } = await getInventoryMeter({keyword: searchText, park, isNeedBind: !filterBind});
const { code, message, data: parks = [] } = await getInventoryMeter({keyword: searchText, park, isNeedBind: !filterBind, status: 1});
if (code !== OK) {
alertInfo(message)
return
@@ -211,8 +292,8 @@ Component({
})
},
async onSearchMeterBox() {
const { park } = this.data;
const { code, message, data = [] } = await getParkBoxList({park});
const { park, building } = this.data;
const { code, message, data = [] } = await getParkBoxList({park, building});
if (code !== OK) {
alertInfo(message)
return

View File

@@ -36,6 +36,36 @@
bind:confirm="onMeterTypeConfirm"
/>
</view>
<view wx:elif="{{type === 'noticeFlowType'}}">
<van-picker
custom-style="width: 100%;"
columns="{{ noticeFlowType }}"
title="{{title}}"
show-toolbar="{{true}}"
bind:cancel="onCancel"
bind:confirm="onNoticeFlowTypeConfirm"
/>
</view>
<view wx:elif="{{type === 'meterMode'}}">
<van-picker
custom-style="width: 100%;"
columns="{{ meterMode }}"
title="{{title}}"
show-toolbar="{{true}}"
bind:cancel="onCancel"
bind:confirm="onMeterModeConfirm"
/>
</view>
<view wx:elif="{{type === 'noticeFlowStatus'}}">
<van-picker
custom-style="width: 100%;"
columns="{{ noticeFlowStatus }}"
title="{{title}}"
show-toolbar="{{true}}"
bind:cancel="onCancel"
bind:confirm="onNoticeFlowStatusConfirm"
/>
</view>
<view wx:elif="{{type !== 'pay'}}">
<van-search
value="{{ value }}"

View File

@@ -19,6 +19,9 @@ Component({
useSlot: Boolean,
hideBorder: Boolean,
required: Boolean,
transparent: Boolean,
allowClear: Boolean,
hideMargin: Boolean,
},
/**
@@ -41,12 +44,14 @@ Component({
},
onChangeText(e) {
this.setData({ text: e.detail });
console.log("----------")
this.triggerEvent("changeText", e.detail)
},
onSearchKeyword() {
this.triggerEvent("searchKeyword", this.data.keyword)
this.setData({ keyword: "" })
},
onClear() {
this.triggerEvent("clear")
}
}
})

View File

@@ -1,15 +1,16 @@
<!--components/searchSelectWrapper/index.wxml-->
<view class="wrapper" wx:if="{{type === 'select'}}">
<view class="label"><text class="required" wx:if="{{required}}">*</text>{{ label }}</view>
<view class="content" bind:tap="clickTime" bind:tap="onSearch">
<view class="content" bind:tap="clickTime" bind:tap="onSearch" style="background-color: {{transparent ? 'transparent' : 'white'}};">
<view class="text" wx:if="{{!text}}" style="color: #ccc;"> {{placeholder}} </view>
<view class="text" wx:else> {{text}} </view>
<van-icon name="close" custom-style="margin-right: 16rpx" wx:if="{{allowClear}}" catch:tap="onClear" />
<van-icon name="arrow-down" />
</view>
</view>
<view class="wrapper" wx:if="{{type === 'inputSearch'}}">
<view class="label"><text class="required" wx:if="{{required}}">*</text>{{ label }}</view>
<view class="inputContent" bind:tap="clickTime">
<view class="inputContent" bind:tap="clickTime" style="background-color: {{transparent ? 'transparent' : 'white'}};">
<van-field
value="{{ value }}"
placeholder="{{placeholder}}"
@@ -22,7 +23,7 @@
</view>
<view class="wrapper" wx:if="{{type === 'input'}}">
<view class="label"><text class="required" wx:if="{{required}}">*</text>{{ label }}</view>
<view class="inputContent" bind:tap="clickTime">
<view class="inputContent" bind:tap="clickTime" style="background-color: {{transparent ? 'transparent' : 'white'}};">
<van-field
value="{{ value }}"
placeholder="{{placeholder}}"
@@ -36,7 +37,7 @@
<view class="wrapper" wx:if="{{useSlot}}">
<view class="label"><text class="required" wx:if="{{required}}">*</text>{{ label }}</view>
<view class="inputContent" bind:tap="clickTime" style="{{hideBorder ? 'border: none;' : ''}}">
<view class="inputContent" bind:tap="clickTime" style="{{hideBorder ? 'border: none;' : ''}} {{transparent ? 'background-color: transparent;' : ''}} {{hideMargin ? 'margin: 0;' : ''}}">
<slot></slot>
</view>
</view>

View File

@@ -15,6 +15,7 @@
border-radius: 12rpx;
border: 1rpx solid #ccc;
background-color: #fff;
position: relative;
}
.inputContent {
@@ -26,6 +27,7 @@
border-radius: 12rpx;
border: 1rpx solid #ccc;
background-color: #fff;
position: relative;
}
.text {
@@ -39,4 +41,5 @@
.required {
color: rgb(209, 83, 25);
font-size: 30rpx;
}
}

View File

@@ -13,6 +13,7 @@ Page({
{ title: '峰',renderBody: (item) => { return item?.peak } },
{ title: '平',renderBody: (item) => { return item?.flat } },
{ title: '谷',renderBody: (item) => { return item?.valley } },
{ title: '深谷',renderBody: (item) => { return item?.deepValley } },
],
list: []
},
@@ -25,13 +26,13 @@ Page({
this.setData({
data: data,
list: [
{ type: "起码", sharp: data.startSharp, peak: data.startPeak, flat: data.startFlat, valley: data.startValley },
{ type: "止码", sharp: data.endSharp, peak: data.endPeak, flat: data.endFlat, valley: data.endValley },
{ type: "退补电量", sharp: data.refundSharp, peak: data.refundPeak, flat: data.refundFlat, valley: data.refundValley },
{ type: "从表电量", sharp: getRoundNumber(data.nestSharp), peak: getRoundNumber(data.nestPeak), flat: getRoundNumber(data.nestFlat), valley: getRoundNumber(data.nestValley) },
{ type: "电度电量", sharp: getRoundNumber(data?.critical?.amount), peak: getRoundNumber(data.peak?.amount), flat: getRoundNumber(data.flat?.amount), valley: getRoundNumber(data.valley?.amount) },
{ type: "分时单价", sharp: data.critical?.price, peak: data.peak?.price, flat: data.flat?.price, valley: data.valley?.price },
{ type: "电费", sharp: getRoundNumber(data.chargeSharp), peak: getRoundNumber(data.chargePeak), flat: getRoundNumber(data.chargeFlat), valley: getRoundNumber(data.chargeValley) },
{ type: "起码", sharp: data.startSharp, peak: data.startPeak, flat: data.startFlat, valley: data.startValley, deepValley: data.startDeepValley },
{ type: "止码", sharp: data.endSharp, peak: data.endPeak, flat: data.endFlat, valley: data.endValley, deepValley: data.endDeepValley },
{ type: "退补电量", sharp: data.refundSharp, peak: data.refundPeak, flat: data.refundFlat, valley: data.refundValley, deepValley: data.refundDeepValley },
{ type: "从表电量", sharp: getRoundNumber(data.nestSharp), peak: getRoundNumber(data.nestPeak), flat: getRoundNumber(data.nestFlat), valley: getRoundNumber(data.nestValley), deepValley: getRoundNumber(data.nestDeepValley) },
{ type: "电度电量", sharp: getRoundNumber(data?.critical?.amount), peak: getRoundNumber(data.peak?.amount), flat: getRoundNumber(data.flat?.amount), valley: getRoundNumber(data.valley?.amount), deepValley: getRoundNumber(data?.deepValley?.amount) },
{ type: "分时单价", sharp: data.critical?.price, peak: data.peak?.price, flat: data.flat?.price, valley: data.valley?.price , valley: data.valley?.price, deepValley: data.deepValley?.price},
{ type: "电费", sharp: getRoundNumber(data.chargeSharp), peak: getRoundNumber(data.chargePeak), flat: getRoundNumber(data.chargeFlat), valley: getRoundNumber(data.chargeValley), deepValley: getRoundNumber(data.chargeDeepValley) },
]
})
},

View File

@@ -1,6 +1,8 @@
// pages/home/index.js
import { getMeterDetail, getMeterList, getTenementMeterList } from "../../service/meter";
import { getOwnTenementList, getTenementExceptionalCase } from "../../service/tenement";
import { getOwnTenementList, getTenementExceptionalCase ,
getTenementBackInfo, getTenementDetail, getTenementInfoDetail,
} from "../../service/tenement";
import { alertInfo, alertSuccess } from "../../utils/index";
import request from '../../utils/request';
import { getDot } from "../../utils/system";
@@ -159,6 +161,19 @@ Page({
alertInfo("账号存在异常,无法进行充值,请联系客服处理")
return;
}
const {
code: tenementDetailCode,
message: tenementDetailMessage,
tenement: tenementDetail,
} = await getTenementBackInfo(park?.id, tenement?.id)
if (tenementDetailCode !== OK) {
alertInfo(tenementDetailMessage)
return
}
if (tenementDetail?.stop_top) {
alertInfo("您暂不可使用此功能,可联系客服处理。")
return;
}
const that = this;
if (!user || !user.id) {
alertInfo("请先登录")

View File

@@ -1,5 +1,6 @@
// pages/invoiceList/components/notyet/index.js
import { getInvoiceList } from '../../../../service/invoice';
import { getTenementBackInfo } from '../../../../service/tenement';
import { alertInfo, loadingFunc } from '../../../../utils/index';
import request from '../../../../utils/request';
const { OK } = request;
@@ -69,7 +70,18 @@ Component({
selectMoney: Number(selectMoney.toFixed(2))
})
},
next() {
async next() {
const park = wx.getStorageSync("park")
const tenement = wx.getStorageSync("tenement")
const { code: detailCode, message: detailMessage, tenement: Detail } = await getTenementBackInfo(park?.id, tenement?.id)
if (detailCode !== OK) {
alertInfo(detailMessage)
return;
}
if (Detail?.stop_invoice) {
alertInfo("您暂不可使用此功能,可联系客服处理。")
return
}
const { selectList, list, selectMoney, selectCount } = this.data;
let tenementID = "";
let tenementName = "";

View File

@@ -58,7 +58,6 @@ Page({
const { token, ...user } = data
wx.setStorageSync('user', user)
wx.setStorageSync('token', data?.token)
console.log("user.workStatus", user.workStatus)
if (user.workStatus) {
wx.redirectTo({
url: '/pages/workBenchNew/index',

View File

@@ -11,46 +11,6 @@
</view>
<view class="customTable" wx:if="{{list.length}}">
<!-- <view class="customTableTile">
<van-row>
<van-col span="4">
<view style="text-align: center;"> 日期 </view>
</van-col>
<van-col span="6">
<view style="text-align: center;"> 充值金额 </view>
</van-col>
<van-col span="6">
<view style="text-align: center;"> 电费 </view>
</van-col>
<van-col span="8">
<view style="text-align: center;"> 电表余额 </view>
</van-col>
</van-row>
</view>
<view class="customTableContent" wx:for="{{list}}" wx:key="id">
<view class="tableRow">
<van-row>
<van-col span="4">
<view style="text-align: center;"> {{ item.day }} </view>
</van-col>
<van-col span="6">
<view style="text-align: center;" wx:if="{{item.type === 1 || item.type === 7}}"> {{ item.topFee }} </view>
<view style="text-align: center;" wx:elif="{{item.type === 5 || item.type === 6 || item.type === 8}}"> -{{ item.topFee }} </view>
<view style="text-align: center;" wx:else> 0 </view>
</van-col>
<van-col span="6">
<view style="text-align: center;" wx:if="{{item.type == 1 || item.type === 5 || item.type === 6 || item.type === 7 || item.type === 8}}">
0
</view>
<view style="text-align: center;" wx:else> {{item.money}} </view>
</van-col>
<van-col span="8">
<view style="text-align: center;"> {{item.balance}} </view>
</van-col>
</van-row>
</view>
</view> -->
<table
header="{{header}}"
list="{{list}}"

View File

@@ -64,16 +64,17 @@ Component({
})
},
async onSubmit() {
const { overall, critical, peak, valley, park, tenement, meter, readAt } = this.data;
const { overall, critical, peak, valley, park, tenement, meter, readAt, deepValley } = this.data;
const { code, message } = await bindMeter(
park,
tenement,
{
code: meter,
overall:overall? Number(overall) : overall,
critical : critical ? Number(critical) : critical,
peak: peak ? Number(peak) : peak,
valley : valley ? Number(valley) : valley,
overall:overall? Number(overall) : (overall === "" ? null : overall),
critical : critical ? Number(critical) : (critical === "" ? null : critical),
peak: peak ? Number(peak) : (peak === "" ? null : peak),
valley : valley ? Number(valley) : (valley === "" ? null : valley),
deepValley : deepValley ? Number(deepValley) : (deepValley === "" ? null : deepValley),
readAt: readAt || dayjs().format('YYYY-MM-DD HH:mm:ss')
}
)

View File

@@ -101,6 +101,16 @@
type="digit"
placeholder="请输入有功(谷)"
/>
<van-field
value="{{ deepValley }}"
label="深谷"
title-width="132rpx"
border="{{false}}"
bind:change="onChange"
data-name="deepValley"
type="digit"
placeholder="请输入有功(深谷)"
/>
</view>
</van-dialog>

View File

@@ -69,16 +69,17 @@ Component({
})
},
async onSubmit() {
const { overall, critical, peak, valley, park, tenement, meterId,readAt } = this.data;
const { overall, critical, peak, valley, deepValley, park, tenement, meterId,readAt } = this.data;
const { code, message, } = await unbindMeter(
park,
tenement,
meterId,
{
overall:overall? Number(overall) : overall,
critical : critical ? Number(critical) : critical,
peak: peak ? Number(peak) : peak,
valley : valley ? Number(valley) : valley,
overall:overall? Number(overall) : (overall === "" ? null : overall),
critical : critical ? Number(critical) : (critical === "" ? null : critical),
peak: peak ? Number(peak) : (peak === "" ? null : peak),
valley : valley ? Number(valley) : (valley === "" ? null : valley),
deepValley: deepValley ? Number(deepValley) : (deepValley === "" ? null : deepValley),
readAt: readAt || dayjs().format('YYYY-MM-DD HH:mm:ss')
});
if (code !== OK) {

View File

@@ -89,6 +89,16 @@
data-name="valley"
placeholder="请输入有功(谷)"
/>
<van-field
value="{{ deepValley }}"
label="深谷"
type="number"
title-width="132rpx"
border="{{false}}"
bind:change="onChange"
data-name="deepValley"
placeholder="请输入有功(深谷)"
/>
</view>
</van-dialog>

View File

@@ -14,6 +14,8 @@ Page({
data: {
time: "",
area: "",
placeholder: "",
collections: [],
},
/**
@@ -113,7 +115,7 @@ Page({
}
this.setData({
show: true,
title: "采集器A",
title: "互感器A",
type: 'collection',
collection: "A"
})
@@ -126,7 +128,7 @@ Page({
}
this.setData({
show: true,
title: "采集器B",
title: "互感器B",
type: 'collection',
collection: "B"
})
@@ -139,11 +141,32 @@ Page({
}
this.setData({
show: true,
title: "采集器C",
title: "互感器C",
type: 'collection',
collection: "C"
})
},
onBindCollector() {
const { park } = this.data;
if (!park) {
alertInfo("请先选择园区")
return;
}
this.setData({
show: true,
title: "采集器",
type: 'collector',
})
},
clearCollector() {
this.setData({
show: false,
title: "",
type: 'collector',
collector: null,
collectorName: null,
})
},
uploadImage() {
const that = this;
wx.chooseMedia({
@@ -151,7 +174,6 @@ Page({
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({
@@ -179,10 +201,40 @@ Page({
sn: e.detail,
})
},
clearData() {
this.setData({
tenement: null,
tenementName: null,
building: null,
buildingName: null,
meterBox: null,
meterBoxName: null,
meter: null,
meterName: null,
card: null,
cardName: null,
collectionA: null,
collectionAName: null,
collectionB: null,
collectionBName: null,
collectionB: null,
collectionBName: null,
address: null,
sharp: null,
peak: null,
flat: null,
valley: null,
deepValley: null,
area: null,
collector: null,
collectorName: null,
collections: [],
})
},
onConfirm(e) {
console.log("e", e)
const { type, data = {}, way } = e.detail;
const {collection, park, tenement} = this.data;
const {collection, park, meterType, tenement, tenementName, overall, sharp, flat, peak, valley, deepValley} = this.data;
switch(type) {
case "park":
this.setData({
@@ -191,30 +243,7 @@ Page({
selfManagement: data.selfManagement,
})
if (park !== data.id) {
this.setData({
tenement: null,
tenementName: null,
building: null,
buildingName: null,
meterBox: null,
meterBoxName: null,
meter: null,
meterName: null,
card: null,
cardName: null,
collectionA: null,
collectionAName: null,
collectionB: null,
collectionBName: null,
collectionB: null,
collectionBName: null,
address: null,
sharp: null,
peak: null,
flat: null,
valley: null,
area: null,
})
this.clearData()
}
break;
case "tenement":
@@ -248,11 +277,31 @@ Page({
})
break;
case "meterType":
let newMeterData = {};
if (way !== 0) {
newMeterData = {
tenement: null,
tenementName: null,
overall: null,
sharp: null,
peak: null,
flat: null,
valley: null,
deepValley: null,
}
}
this.setData({
meterType: way,
meterTypeName: data,
...newMeterData,
});
break;
case "collector":
this.setData({
collector: data?.id,
collectorName: `${data.collectorAddress}-${data.manufacturer}`,
});
break;
case "meter":
this.setData({
meter: data.id,
@@ -266,26 +315,33 @@ Page({
});
break;
case "collection":
const newCollects = this.data.collections;
let newData = {}
if (collection === "A") {
newCollects[0] = data.id
newData = {
collectionA: data.id,
collectionAName: `${data.transformerId}-倍率:${data.ratio}-${data.manufacturer}`,
collectionARatio: data.ratio,
collections: newCollects
}
}
if (collection === "B") {
newCollects[1] = data.id
newData = {
collectionB: data.id,
collectionBName: `${data.transformerId}-倍率:${data.ratio}-${data.manufacturer}`,
collectionBRatio: data.ratio,
collections: newCollects
}
}
if (collection === "C") {
newCollects[2] = data.id
newData = {
collectionC: data.id,
collectionCName: `${data.transformerId}-倍率:${data.ratio}-${data.manufacturer}`,
collectionCRatio: data.ratio,
collections: newCollects
}
}
this.setData(newData);
@@ -293,6 +349,39 @@ Page({
}
this.onCancel();
},
clearCard() {
this.setData({
card: null,
cardName: null,
})
},
clearCollectionA() {
const newCollects = this.data.collections;
newCollects[0] = null;
this.setData({
collectionA: null,
collectionAName: null,
collections: newCollects,
})
},
clearCollectionB() {
const newCollects = this.data.collections;
newCollects[1] = null;
this.setData({
collectionB: null,
collectionBName: null,
collections: newCollects,
})
},
clearCollectionC() {
const newCollects = this.data.collections;
newCollects[2] = null;
this.setData({
collectionC: null,
collectionCName: null,
collections: newCollects,
})
},
changeAddress(e) {
this.setData({
address: e.detail
@@ -328,6 +417,11 @@ Page({
valley: e.detail
})
},
changeDeepValley(e) {
this.setData({
deepValley: e.detail
})
},
changeRatio(e) {
this.setData({
ratio: e.detail,
@@ -357,10 +451,10 @@ Page({
const {
park, meter, address, building, meterBox, meterType,
ratio, area, card, collectionA, collectionB, collectionC,
tenement, sharp, peak, flat, valley, overall, url, sn,
collectionARatio, collectionBRatio, collectionCRatio
tenement, sharp, peak, flat, valley, deepValley, overall, url, sn,
collectionARatio, collectionBRatio, collectionCRatio, collector,
} = this.data;
if (!park || !(meter || sn) || !address || meterType == null) {
if (!park || !(meter || sn) || !address || meterType == null || !building || !meterBox || ratio == null) {
alertInfo("请填写必填项后保存")
return;
}
@@ -369,7 +463,7 @@ Page({
(collectionA == collectionC&& collectionA != null && collectionC != null) ||
(collectionC == collectionB && collectionB != null && collectionC != null)
) {
alertInfo("采集器不能重复选择")
alertInfo("互感器不能重复选择")
return;
}
if (
@@ -377,19 +471,35 @@ Page({
(collectionARatio != collectionCRatio&& collectionARatio != null && collectionCRatio != null) ||
(collectionCRatio != collectionBRatio && collectionBRatio != null && collectionCRatio != null)
) {
alertInfo("采集器倍率不一致")
alertInfo("互感器倍率不一致")
return;
}
const { code, data, message } = await installMeter({
park, meter, address, building, meterBox, meterType,
park, meterSn: meter, address, building, meterBox, meterType,
ratio, area, card, collectionA, collectionB, collectionC,
tenement, sharp, peak, flat, valley, overall, url, sn
tenement,
sharp: sharp === "" ? null : sharp,
peak: peak === "" ? null : peak,
flat: flat === "" ? null : flat,
valley: valley === "" ? null : valley,
overall: overall === "" ? null : overall,
deepValley: deepValley == "" ? null : deepValley,
url, sn, collector
})
if (code !== OK) {
alertInfo(message)
return;
}
alertSuccess("新增成功")
this.setData({
park: null,
parkName: null,
})
this.clearData()
wx.navigateTo({
url: '/pages/workBenchTodoList/index',
})
},
goback() {
wx.navigateBack()

View File

@@ -41,6 +41,7 @@
placeholder="请选择建筑"
text="{{buildingName}}"
bind:search="onBuildingFocus"
required="{{true}}"
/>
<searchSelectWrapper
@@ -48,6 +49,8 @@
placeholder="请选择电表箱"
text="{{meterBoxName}}"
bind:search="onMeterBoxFocus"
required="{{true}}"
/>
<searchSelectWrapper
label="电表类型"
@@ -61,6 +64,7 @@
placeholder="请输入倍率"
type="input"
text="ratio"
required="{{true}}"
bind:changeText="changeRatio"
/>
<searchSelectWrapper
@@ -83,60 +87,89 @@
placeholder="请选择卡绑定(选填)"
text="{{cardName}}"
bind:search="onBindCard"
allowClear="{{true}}"
bind:clear="clearCard"
/>
<searchSelectWrapper
label="采集器A"
placeholder="请选择采集器绑定(选填)"
label="采集器"
placeholder="请选择采集器绑定"
text="{{collectorName}}"
bind:search="onBindCollector"
allowClear="{{true}}"
bind:clear="clearCollector"
/>
<searchSelectWrapper
label="互感器A"
placeholder="请选择互感器绑定"
text="{{collectionAName}}"
bind:search="onBindCollectionA"
allowClear="{{true}}"
bind:clear="clearCollectionA"
/>
<searchSelectWrapper
label="采集器B"
placeholder="请选择采集器绑定(选填)"
label="互感器B"
placeholder="请选择互感器绑定"
text="{{collectionBName}}"
bind:search="onBindCollectionB"
allowClear="{{true}}"
bind:clear="clearCollectionB"
/>
<searchSelectWrapper
label="采集器C"
placeholder="请选择采集器绑定(选填)"
label="互感器C"
placeholder="请选择互感器绑定"
text="{{collectionCName}}"
bind:search="onBindCollectionC"
allowClear="{{true}}"
bind:clear="clearCollectionC"
/>
<searchSelectWrapper
label="商户"
placeholder="请选择商户"
text="{{ tenementName }}"
bind:search="onTenementFocus"
wx:if="{{meterType === 0}}"
/>
<searchSelectWrapper
label="总"
placeholder="请输入总"
type="input"
bind:changeText="changeOverall"
wx:if="{{meterType === 0}}"
/>
<searchSelectWrapper
label="尖"
placeholder="请输入尖"
type="input"
bind:changeText="changeSharp"
wx:if="{{meterType === 0}}"
/>
<searchSelectWrapper
label="峰"
placeholder="请输入峰"
type="input"
bind:changeText="changePeak"
wx:if="{{meterType === 0}}"
/>
<searchSelectWrapper
label="平"
placeholder="请输入平"
type="input"
bind:changeText="changeFlat"
wx:if="{{meterType === 0}}"
/>
<searchSelectWrapper
label="谷"
placeholder="请输入谷"
type="input"
bind:changeText="changeValley"
wx:if="{{meterType === 0}}"
/>
<searchSelectWrapper
label="深谷"
placeholder="请输入深谷"
type="input"
bind:changeText="changeDeepValley"
wx:if="{{meterType === 0}}"
/>
<searchSelectWrapper
label="图片"
@@ -170,8 +203,12 @@
title="{{title}}"
type="{{type}}"
park="{{park}}"
building="{{building}}"
bindconfirm="onConfirm"
filterData="{{collections}}"
filterType="collection"
bindcancel="onCancel"
placeholder="{{placeholder}}"
wx:if="{{show}}"
/>

View File

@@ -0,0 +1,149 @@
// pages/workBenchNew/components/kaihu/index.js
import { alertInfo, alertSuccess } from "../../../../utils/index"
import { createBackTenement, updateTenementBackInfo } from "../../../../service/tenement"
import request from "../../../../utils/request"
import { payWays, feeType as feeTypeList } from "../../../../utils/data";
const { OK } = request;
Page({
/**
* 页面的初始数据
*/
data: {
},
onParkFocus(e) {
this.setData({
show: true,
title: "园区",
type: 'park'
})
},
onBuildingFocus() {
const { park } = this.data;
if (!park) {
alertInfo("请先选择园区")
return;
}
this.setData({
show: true,
title: "建筑",
type: 'building'
})
},
onChange(e) {
const { name } = e.currentTarget.dataset;
this.setData({
[name]: e.detail
})
},
onFeeTypeFocus() {
this.setData({
show: true,
title: "收费类型",
type: 'feeType'
})
},
onCancel() {
this.setData({ show: false })
},
async onSubmit() {
const { name, shortName, address, contact,
phone, building, feeType, park, editType, id, parkName,
} = this.data;
const { code, message, tenement } = await createBackTenement(park, { name, shortName, address, contact, phone, building, feeType })
if (code !== OK) {
alertInfo(message)
return
}
alertSuccess("开户成功")
// wx.navigateBack()
wx.redirectTo({
url: `/pages/workBenchNew/components/workBenchTenement/index?park=${park}&parkName=${parkName}&name=${name}&id=${tenement}`,
})
},
handleBack() {
wx.navigateBack()
},
onConfirm(e) {
const { type, data, way } = e.detail;
switch(type) {
case "park":
this.setData({
park: data.id,
parkName: data.name,
show: false,
})
return;
case "building":
this.setData({
building: data.id,
buildingName: data.name,
show: false,
})
return;
case "feeType":
this.setData({
feeTypeName: data,
feeType: way,
show: false,
})
}
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})

View File

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

View File

@@ -0,0 +1,111 @@
<!--pages/workBenchNew/components/kaihu/index.wxml-->
<navigator canBack="{{true}}" title="开户" />
<view class="modalContentWrapper">
<van-field
value="{{ parkName }}"
placeholder="请选择园区"
label="园区"
use-button-slot
readonly
title-width="120rpx"
required
>
<van-button slot="button" size="small" type="info" bind:click="onParkFocus">
选择
</van-button>
</van-field>
<van-field
value="{{name}}"
data-name="name"
bind:change="onChange"
label="商户全称"
type="textarea"
placeholder="请输入商户全称"
autosize="{{true}}"
title-width="132rpx"
required
/>
<van-field
value="{{shortName}}"
data-name="shortName"
bind:change="onChange"
label="商户简称"
placeholder="请输入商户简称"
type="textarea"
autosize="{{true}}"
title-width="132rpx"
/>
<van-field
value="{{address}}"
data-name="address"
bind:change="onChange"
label="联系地址"
placeholder="请输入联系地址"
type="textarea"
autosize="{{true}}"
title-width="132rpx"
required
/>
<van-field
value="{{contact}}"
data-name="contact"
bind:change="onChange"
label="联系人"
placeholder="请输入联系人"
type="textarea"
autosize="{{true}}"
title-width="132rpx"
required
/>
<van-field
value="{{phone}}"
data-name="phone"
bind:change="onChange"
label="联系电话"
placeholder="请输入联系电话"
type="textarea"
autosize="{{true}}"
title-width="132rpx"
required
/>
<van-field
value="{{ buildingName }}"
placeholder="请选择建筑"
label="建筑"
use-button-slot
readonly
title-width="120rpx"
required
>
<van-button slot="button" size="small" type="info" bind:click="onBuildingFocus">
选择
</van-button>
</van-field>
<van-field
value="{{ feeTypeName }}"
placeholder="请选择收费类型"
label="收费类型"
readonly
use-button-slot
title-width="120rpx"
>
<van-button slot="button" size="small" type="info" bind:click="onFeeTypeFocus">
选择
</van-button>
</van-field>
</view>
<view class="operate">
<view style="margin-top: 60rpx; margin-bottom: 60rpx;display: flex; justify-content: center; align-items: center;">
<van-button type="info" size="small" style="margin-right: 30rpx;" bind:click="onSubmit" data-status="0"> 保存 </van-button>
<van-button size="small" bind:click="handleBack" data-status="1"> 返回 </van-button>
</view>
</view>
<search-select
show="{{show}}"
title="{{title}}"
type="{{type}}"
park="{{park}}"
bindconfirm="onConfirm"
bindcancel="onCancel"
/>

View File

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

View File

@@ -50,6 +50,7 @@ Page({
this.setData({
meterName: `${data.meterNo}-${data.address}${data.tenement?.name ? '-' + data.tenement?.name : ''}`,
meter: data.id,
meterInfo: data,
})
break;
case "pay":
@@ -98,7 +99,7 @@ Page({
},
async handleSubmit() {
const that = this;
const { park, meter, money, way, voucherNo } = this.data;
const { park, meter, money, way, voucherNo, meterInfo } = this.data;
if (!park) {
alertInfo("请选择园区");
return;
@@ -125,7 +126,8 @@ Page({
meter,
paymentType: way,
voucherNo,
type: 0
type: 0 ,
tenement: meterInfo?.tenement,
})
if (code !== OK) {
alertInfo(message)

View File

@@ -17,11 +17,23 @@
<searchSelectWrapper
label="金额"
placeholder="请输入金额"
text="{{meterName}}"
fieldType="number"
type="input"
text="{{money}}"
bind:changeText="onChangeMoney"
/>
useSlot="{{true}}"
hideBorder="{{true}}"
hideMargin="{{true}}"
type=""
>
<view class="inputContent">
<van-field
value="{{ money }}"
placeholder="请输入金额"
border="{{ false }}"
bind:change="onChangeMoney"
custom-style="padding: 8rpx 0;font-size: 30rpx;line-height: 32rpx;"
/>
</view>
</searchSelectWrapper>
<searchSelectWrapper
label="付款方式"
placeholder="请选择付款方式"
@@ -31,9 +43,24 @@
<searchSelectWrapper
label="凭证"
placeholder="请输入凭证"
type="input"
bind:changeText="onChangeVoucherNo"
/>
text="{{voucherNo}}"
fieldType="number"
bind:changeText="onChangeMoney"
useSlot="{{true}}"
hideBorder="{{true}}"
hideMargin="{{true}}"
type=""
>
<view class="inputContent">
<van-field
value="{{ voucherNo }}"
placeholder="请输入凭证"
border="{{ false }}"
bind:change="onChangeVoucherNo"
custom-style="padding: 8rpx 0;font-size: 30rpx;line-height: 32rpx;"
/>
</view>
</searchSelectWrapper>
</van-cell-group>
<view style="margin-top: 60rpx;display: flex; justify-content: center; align-items: center;">

View File

@@ -1 +1,17 @@
/* pages/workBenchNew/components/recharge/index.wxss */
/* pages/workBenchNew/components/recharge/index.wxss */
.inputContent {
flex: 1;
margin-right: 10rpx;
display: flex;
padding: 0 20rpx;
border-radius: 12rpx;
border: 1rpx solid #ccc;
background-color: #fff;
position: relative;
}
.text {
flex: 1;
}

View File

@@ -1,6 +1,12 @@
// pages/workBenchNew/components/uninstallMeter/index.js
import { uninstallMeter, } from "../../../../service/meter";
import dayjs from "../../../../utils/dayjs"
import { alertInfo, } from "../../../../utils/index"
import request from "../../../../utils/request"
import { alertInfo, alertSuccess, loadingFunc, wxModal} from "../../../../utils/index"
import { uploadUninstallMeter } from "../../../../service/public"
const { OK } = request;
Page({
/**
@@ -36,6 +42,9 @@ Page({
this.setData({
park: data.id,
parkName: data.name,
meter: null,
meterInfo: null,
meterName: null,
})
break;
case "tenement":
@@ -66,6 +75,7 @@ Page({
this.setData({
meter: data.id,
meterName: data.address,
meterInfo: data,
});
break;
case "card":
@@ -106,6 +116,125 @@ Page({
type: "",
})
},
changeCritical(e) {
this.setData({
critical: e.detail,
})
},
changePeak(e) {
this.setData({
peak: e.detail,
})
},
changeFlat(e) {
this.setData({
flat: e.detail,
})
},
changeValley(e) {
this.setData({
valley: e.detail,
})
},
changeOverall(e) {
this.setData({
overall: e.detail,
})
},
changeDeppValley(e) {
this.setData({
deepOverall: e.detail,
})
},
async onSubmit() {
const { meter, reason, url, meterInfo, critical, peak, flat, valley, overall, deepOverall } = this.data;
if (!meter) {
alertInfo("请选择表号")
return;
}
if (!meterInfo?.tenement) {
const { code, message } = await uninstallMeter({sn: meter, images: url, reason, tenement: meterInfo.tenement, critical, peak, flat, valley, overall, deepOverall})
if (code !== OK) {
alertInfo(message)
return
}
alertSuccess("拆除成功")
setTimeout(() => {
wx.navigateTo({
url: '/pages/workBenchTodoList/index',
})
}, 300)
return;
}
wx.showModal({
title: '提示',
content: '拆出后电表和商户关系,电表和卡的关系会自动解绑,是否拆出',
complete: async (res) => {
if (res.cancel) {
}
if (res.confirm) {
const { code, message } = await uninstallMeter({sn: meter, images: url, reason, tenement: meterInfo.tenement, critical, peak, flat, valley, overall, deepOverall})
if (code !== OK) {
alertInfo(message)
return
}
alertSuccess("拆除成功")
setTimeout(() => {
wx.navigateTo({
url: '/pages/workBenchTodoList/index',
})
}, 300)
return;
}
}
})
},
uploadImage() {
const that = this;
wx.chooseMedia({
count: 1,
mediaType: ['image'],
sourceType: ['album', 'camera'],
success: async function(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 uploadUninstallMeter(tempFilePaths)
if (code !== OK) {
alertError(message)
return
}
that.setData({
url: url
})
})
}
})
},
clearImage() {
this.setData({
url: ""
})
},
showImage() {
this.setData({
imageShow: true
})
},
onClose() {
this.setData({
imageShow: false
})
},
goback() {
wx.navigateBack()
},

View File

@@ -5,7 +5,8 @@
"search-select": "/components/searchSelect/index",
"van-field": "@vant/weapp/field/index",
"van-button": "@vant/weapp/button/index",
"searchSelectWrapper": "/components/searchSelectWrapper/index"
"searchSelectWrapper": "/components/searchSelectWrapper/index",
"van-image": "@vant/weapp/image/index"
},
"navigationStyle": "custom"
}

View File

@@ -39,11 +39,61 @@
type=""
hideBorder="{{true}}"
>
<van-button wx:if="{{!image}}" type="info" size="small"> 上传 </van-button>
<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;" bind:tap="showImage" />
</view>
</searchSelectWrapper>
<searchSelectWrapper
label="总"
placeholder="请输入总"
type="input"
bind:changeText="changeOverall"
wx:if="{{meterInfo.tenement}}"
/>
<searchSelectWrapper
label="尖"
placeholder="请输入尖"
type="input"
bind:changeText="changeCritical"
wx:if="{{meterInfo.tenement}}"
/>
<searchSelectWrapper
label="峰"
placeholder="请输入峰"
type="input"
bind:changeText="changePeak"
wx:if="{{meterInfo.tenement}}"
/>
<searchSelectWrapper
label="平"
placeholder="请输入平"
type="input"
bind:changeText="changeFlat"
wx:if="{{meterInfo.tenement}}"
/>
<searchSelectWrapper
label="谷"
placeholder="请输入谷"
type="input"
bind:changeText="changeValley"
wx:if="{{meterInfo.tenement}}"
/>
<searchSelectWrapper
label="深谷"
placeholder="请输入深谷"
type="input"
bind:changeText="changeDeepValley"
wx:if="{{meterInfo.tenement}}"
/>
<view class="operate">
<view class="submit"> <van-button type="info" block> 提交 </van-button> </view>
<view class="submit"> <van-button type="info" block bind:click="onSubmit"> 提交 </van-button> </view>
<view class="cancel"> <van-button block bind:tap="goback"> 返回 </van-button> </view>
</view>
</view>

View File

@@ -0,0 +1,267 @@
// pages/workBenchNew/components/workBenchMeter/index.js
import { alertInfo, alertSuccess, loadingFunc } from "../../../../utils/index";
import { getParkMeterList, handleOperateMeterMode } from "../../../../service/meter"
import { uploadMeterForce } from "../../../../service/public"
import request from "../../../../utils/request"
const { OK } = request
Page({
/**
* 页面的初始数据
*/
data: {
keyword: "",
keywordTemp: "",
page: 1,
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
onParkFocus(e) {
this.setData({
show: true,
title: "园区",
type: 'park'
})
},
onModeFocus(e) {
this.setData({
show: true,
title: "强控类型",
type: 'meterMode'
})
},
onMeterFocus(e) {
const { park } = this.data;
if (!park) {
alertInfo("请先选择园区")
return;
}
this.setData({
show: true,
title: "电表",
type: 'meter'
})
},
onConfirm(e) {
const { data, type, way } = e.detail;
const that = this;
switch(type) {
case "park":
this.setData({
parkName: data.name,
park: data.id,
})
break;
case "meterMode":
this.setData({
modeName: data,
mode: way,
})
break;
case "meter":
this.setData({
meterName: data.address,
meter: data.id,
}, () => {
loadingFunc(async () => {
await that.init();
})
})
break;
}
this.onCancel();
},
onChangeKeyword(e) {
this.setData({ keywordTemp: e.detail })
},
changeDays(e) {
this.setData({
days: e.detail,
})
},
handleSubmit() {
const that = this;
const { mode, days, reason, meter, meterName, url } = this.data;
if (mode === 2 && days == null) {
alertInfo("请填写天数")
return;
}
wx.showModal({
title: '提示',
content: `确定要对${meterName}进行${["预付费", "强控", "临时强控"][mode]}操作吗?`,
complete: async (res) => {
if (res.cancel) {
}
if (res.confirm) {
loadingFunc(async () => {
const { code, message } = await handleOperateMeterMode({ ids: [meter], mode, days: days == null ? undefined : Number(days), reason, images: url })
if (code !== OK) {
alertInfo(message)
await that.init();
return
}
alertSuccess("操作成功")
await that.init();
this.setData({
mode: null,
modeName: null,
days: null,
reason: null,
url: null,
})
})
}
}
})
},
uploadImage() {
const that = this;
wx.chooseMedia({
count: 1,
mediaType: ['image'],
sourceType: ['album', 'camera'],
success: async function(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 uploadMeterForce(tempFilePaths)
if (code !== OK) {
alertError(message)
return
}
that.setData({
url: url
})
})
}
})
},
goback() {
wx.navigateBack();
},
clearImage() {
this.setData({
url: ""
})
},
changeReason(e) {
this.setData({
reason: e.detail,
})
},
onSearch() {
const that = this;
that.setData({
keyword: that.data.keywordTemp
}, () => {
loadingFunc(async () => {
await that.init();
})
})
},
async init() {
const { page, park, meter } = this.data;
if (!park) {
return;
}
const { code, message, data, total } = await getParkMeterList({ park, keyword: meter, page })
if (code !== OK) {
alertInfo(message);
return;
}
this.setData({
list: data,
total: total,
totalPage: Math.ceil(total / 20)
})
},
async onChangePage(e) {
const page = e.detail.currentIndex;
const that = this;
this.setData({
page
}, () => {
loadingFunc(async () => {
await that.init();
})
})
},
onCancel() {
this.setData({
show: false,
title: "",
type: "",
})
},
onChangeSelectMeter(e) {
this.setData({
meter: e.detail
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})

View File

@@ -0,0 +1,21 @@
{
"usingComponents": {
"van-field": "@vant/weapp/field/index",
"van-button": "@vant/weapp/button/index",
"search-select": "/components/searchSelect/index",
"van-empty": "@vant/weapp/empty/index",
"van-image": "@vant/weapp/image/index",
"table": "/components/table/table",
"pagination": "/components/pagination/index",
"empty": "/components/empty/index",
"van-radio": "@vant/weapp/radio/index",
"van-radio-group": "@vant/weapp/radio-group/index",
"van-tag": "@vant/weapp/tag/index",
"van-row": "@vant/weapp/row/index",
"van-col": "@vant/weapp/col/index",
"navigator": "/components/navigator/index",
"searchSelectWrapper": "/components/searchSelectWrapper/index",
"van-popup": "@vant/weapp/popup/index"
},
"navigationStyle": "custom"
}

View File

@@ -0,0 +1,165 @@
<!--pages/workBench/components/record/index.wxml-->
<navigator title="电表操作" canBack="{{true}}" />
<searchSelectWrapper
label="园区"
placeholder="请选择园区"
text="{{parkName}}"
bind:search="onParkFocus"
/>
<searchSelectWrapper
label="电表"
placeholder="请选择电表"
text="{{meterName}}"
bind:search="onMeterFocus"
/>
<van-empty wx:if="{{!meter}}" description="选择电表后查看" />
<view wx:else>
<view wx:if="{{list.length}}">
<!-- <view class="operate">
<view style="margin-top: 24rpx; margin-bottom: 24rpx;display: flex; justify-content: center; align-items: center;">
<van-button
type="info"
size="small"
style="margin-right: 30rpx;"
bind:click="handleMeterSwitchOn"
disabled="{{!meter}}"
> 合闸 </van-button>
<van-button size="small" bind:click="handleClear" disabled="{{!meter}}" bind:click="handleMeterSwitchOff"> 拉闸 </van-button>
</view>
</view> -->
<view class="customTable" wx:for="{{list}}" wx:key="id">
<view class="customTableTile">
<van-row>
<van-col span="8">
<view style="text-align: center;"> {{item.tenement.shortName}} </view>
</van-col>
<van-col span="16"><view style="margin-left: 16rpx;">{{item.tenement.name}}</view> </van-col>
</van-row>
</view>
<view class="customTableContent">
<van-row >
<van-col span="24">
<view class="tableRow">
<van-row gutter="5">
<van-col span="8" wx:if="{{item.type === 0}}">
<view style="text-align: center;border-right: 1rpx solid #ccc;"> 商户电表 </view></van-col>
<van-col span="8" wx:elif="{{item.type === 2}}">
<view style="text-align: center;border-right: 1rpx solid #ccc;"> 公摊电表 </view></van-col>
<van-col span="8" wx:else>
<view style="text-align: center;border-right: 1rpx solid #ccc;"> 园区电表 </view></van-col>
<van-col span="16">表号:{{item.meterNo}}</van-col>
</van-row>
</view>
</van-col>
<van-col span="24">
<view class="tableRow">
<van-row gutter="5">
<van-col span="8">
<view style="text-align: center;border-right: 1rpx solid #ccc;"> {{item.address}} </view>
</van-col>
<van-col span="16">SN{{item.meterSn}}</van-col>
</van-row>
</view>
</van-col>
<van-col span="24">
<view class="tableRow">
<van-row gutter="5">
<van-col span="8">
<view style="text-align: center;border-right: 1rpx solid #ccc;"> 表字:{{item.amount}} </view>
</van-col>
<van-col span="16">余额:{{item.money}}</van-col>
</van-row>
</view>
</van-col>
<van-col span="24">
<view class="tableRow">
<van-row gutter="5">
<van-col span="8" wx:if="{{item.onPosition === 0}}">
<view style="text-align: center;border-right: 1rpx solid #ccc;">合闸</view> </van-col>
<van-col span="8" wx:else><view style="text-align: center;border-right: 1rpx solid #ccc;">拉闸</view> </van-col>
<van-col span="8" wx:if="{{item.canConnect}}">
<view style="display: flex;align-items: center;">
<view style="text-align: center; margin-right: 24rpx;">在线</view>
<view wx:if="{{item.mode === 0}}"> 预付费 </view>
<view wx:if="{{item.mode === 1}}"> 强控 </view>
<view wx:if="{{item.mode === 2}}"> 临时强控 </view>
</view>
</van-col>
<van-col span="8" wx:else>
<view style="display: flex;align-items: center; margin-right: 24rpx;">
<view style="text-align: center;">失联</view>
<view wx:if="{{item.mode === 0}}"> 预付费 </view>
<view wx:if="{{item.mode === 1}}"> 强控 </view>
<view wx:if="{{item.mode === 2}}"> 临时强控 </view>
</view>
</van-col>
</van-row>
</view>
</van-col>
</van-row>
</view>
</view>
<view class="wrapper">
<searchSelectWrapper
label="强控类型"
placeholder="请选择强控类型"
text="{{modeName}}"
bind:search="onModeFocus"
required="{{true}}"
/>
<searchSelectWrapper
wx:if="{{mode === 2}}"
label="天数"
placeholder="请输入天数"
text="{{days}}"
type="input"
bind:changeText="changeDays"
required="{{true}}"
/>
<searchSelectWrapper
label="原因"
placeholder="请输入原因"
text="{{reason}}"
type="input"
bind:changeText="changeReason"
/>
<searchSelectWrapper
label="图片"
useSlot="{{true}}"
type=""
hideBorder="{{true}}"
transparent="{{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>
</view>
<empty bind:refresh="init" wx:else />
</view>
<search-select
show="{{show}}"
title="{{title}}"
type="{{type}}"
park="{{park}}"
bindconfirm="onConfirm"
bindcancel="onCancel"
wx:if="{{show}}"
/>

View File

@@ -0,0 +1,78 @@
/* pages/workBench/components/record/index.wxss */
.table {
width: 890rpx;
}
.classWrapper {
width: 100vw;
overflow-x: auto;
}
.thead {
display: flex;
flex-wrap: nowrap;
border-bottom: 1rpx solid #EEEEEE;
}
.thead .th {
padding: 20rpx;
white-space: nowrap;
text-align: center;
box-sizing: border-box;
}
.tbody {
width: 890rpx;
}
.tbody .tr {
padding: 20rpx;
border-bottom: 1rpx solid #EEEEEE;
display: flex;
align-items: center;
flex-wrap: nowrap;
}
.tbody .th {
word-break: break-all;
text-align: center;
}
.customTable {
margin: 20rpx;
}
.customTableTile {
background-color: var(--light-green);
padding: 16rpx;
box-sizing: border-box;
font-weight: 700;
}
.tableRow {
padding: 16rpx;
border: 1rpx solid #ccc;
border-top: 0rpx;
}
page {
background-color: rgb(228,240,236);
font-size: 32rpx;
}
.operate {
display: flex;
padding-top: 24rpx;
padding-bottom: 36rpx;
}
.submit, .cancel {
flex: 1;
}
.submit {
margin-right: 30rpx;
}

View File

@@ -93,7 +93,6 @@ Page({
alertError(message)
return;
}
console.log("data", data, "num", num)
if (!data) {
wx.showModal({
title: '提示',
@@ -146,10 +145,6 @@ Page({
* 生命周期函数--监听页面显示
*/
onShow() {
const { parkName } = this.data;
if (!parkName) {
return
}
this.init()
},

View File

@@ -23,9 +23,8 @@
bindcancel="onConcal"
/>
<van-empty description="请先选择园区" wx:if="{{!park}}" />
<view wx:else>
<view>
<view wx:if="{{list.length}}">
<van-cell
wx:for="{{list}}"

View File

@@ -64,17 +64,18 @@ Component({
})
},
async onSubmit() {
const { overall, critical, peak, valley, park, tenement, meter, readAt, flat } = this.data;
const { overall, critical, peak, valley, deepValley, park, tenement, meter, readAt, flat } = this.data;
const { code, message } = await bindMeter(
park,
tenement,
{
code: meter,
overall:overall? Number(overall) : overall,
critical : critical ? Number(critical) : critical,
peak: peak ? Number(peak) : peak,
flat: flat ? Number(flat) : flat,
valley : valley ? Number(valley) : valley,
overall:overall? Number(overall) : (overall === "" ? null : overall),
critical : critical ? Number(critical) : (critical === "" ? null : critical),
peak: peak ? Number(peak) : (peak === "" ? null : peak),
flat: flat ? Number(flat) : (flat === "" ? null : flat),
valley : valley ? Number(valley) : (valley === "" ? null : valley),
deepValley: deepValley ? Number(deepValley) : (deepValley === "" ? null : deepValley),
readAt: readAt || dayjs().format('YYYY-MM-DD HH:mm:ss')
}
)
@@ -111,6 +112,7 @@ Component({
peak: data?.overall ? Number(data?.peak || 0) : null,
flat: data?.overall ? Number(data?.flat || 0) : null,
valley: data?.overall ? Number(data?.valley || 0) : null,
deepValley: data?.deepValley ? Number(data?.deepValley || 0) : null,
meter04kvType: data?.meter04kvType,
status: data?.breakType ? '合闸' : "分闸",
})

View File

@@ -101,6 +101,16 @@
type="digit"
placeholder="请输入有功(谷)"
/>
<van-field
value="{{ deepValley }}"
label="深谷"
title-width="132rpx"
border="{{false}}"
bind:change="onChange"
data-name="deepValley"
type="digit"
placeholder="请输入有功(深谷)"
/>
</view>
</van-dialog>

View File

@@ -60,6 +60,7 @@ Component({
peak: data?.overall ? Number(data?.peak || 0) : null,
flat: data?.overall ? Number(data?.flat || 0) : null,
valley: data?.overall ? Number(data?.valley || 0) : null,
deepValley: data?.deepValley ? Number(data?.deepValley || 0) : null,
meter04kvType: data?.meter04kvType,
status: data?.breakType ? '合闸' : "分闸"
})
@@ -74,17 +75,18 @@ Component({
})
},
async onSubmit() {
const { overall, critical, peak, valley, park, tenement, meterId,readAt, flat } = this.data;
const { overall, critical, peak, valley, deepValley, park, tenement, meterId,readAt, flat } = this.data;
const { code, message, } = await unbindMeter(
park,
tenement,
meterId,
{
overall:overall? Number(overall) : overall,
critical : critical ? Number(critical) : critical,
peak: peak ? Number(peak) : peak,
flat: flat ? Number(flat) : flat,
valley : valley ? Number(valley) : valley,
overall:overall? Number(overall) : (overall === "" ? null : overall),
critical : critical ? Number(critical) : (critical === "" ? null : critical),
peak: peak ? Number(peak) : (peak === "" ? null : peak),
flat: flat ? Number(flat) : (flat === "" ? null : flat),
valley : valley ? Number(valley) : (valley === "" ? null : valley),
deepValley: deepValley ? Number(deepValley) : (deepValley === null ? "" : deepValley),
readAt: readAt || dayjs().format('YYYY-MM-DD HH:mm:ss')
});
if (code !== OK) {

View File

@@ -89,6 +89,16 @@
data-name="valley"
placeholder="请输入有功(谷)"
/>
<van-field
value="{{ deepValley }}"
label="深谷"
type="number"
title-width="132rpx"
border="{{false}}"
bind:change="onChange"
data-name="deepValley"
placeholder="请输入有功(深谷)"
/>
</view>
</van-dialog>

View File

@@ -20,7 +20,16 @@ Page({
* 生命周期函数--监听页面加载
*/
onLoad(options) {
const { park, parkName, name, id } = options
this.setData({
park,
parkName,
tenementName: name,
tenement: id
})
if (id) {
this.getTenementInfo();
}
},
onParkFocus(e) {
this.setData({

View File

@@ -76,6 +76,21 @@ Page({
url: '/pages/workBenchNew/components/uninstallMeter/index',
})
},
jumpToKaihu() {
wx.navigateTo({
url: '/pages/workBenchNew/components/kaihu/index',
})
},
jumpToMeterControl() {
wx.navigateTo({
url: '/pages/workBenchNew/components/workBenchMeterControl/index',
})
},
workOrder() {
wx.navigateTo({
url: '/pages/workBenchTodoList/index',
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/

View File

@@ -111,13 +111,16 @@
<operate-button text="新装" bind:click="jumpToInstallMeter" />
</van-col>
<van-col span="8">
<operate-button text="开户" />
<operate-button text="开户" bind:click="jumpToKaihu" />
</van-col>
<van-col span="8">
<operate-button text="销户" />
<operate-button text="销户" bind:click="jumpToTenement" />
</van-col>
<van-col span="8">
<operate-button text="强控" />
<operate-button text="强控" bind:click="jumpToMeterControl" />
</van-col>
<van-col span="8">
<operate-button text="工单" bind:click="workOrder" />
</van-col>
</van-row>

View File

@@ -1,18 +1,245 @@
// pages/workBenchTodoList/index.js
import request from "../../utils/request"
import { getWorkOrderList, doNoticeFlow } from "../../service/workBench"
import { alertInfo, alertSuccess, loadingFunc } from "../../utils/index";
import { noticeFlowType as noticeFlowTypeList } from "../../utils/data"
const { OK } = request
Page({
/**
* 页面的初始数据
*/
data: {
page: 1,
size: 20,
noticeFlowTypeList,
actionItems: [{
name: '详情',
value: 'detail'
}],
},
showActionMenu(e) {
const { id, status } = e.currentTarget.dataset;
this.setData({
currentActionSheet: id,
actionItems: status === 0 ? [{
name: '详情',
value: 'detail'
}, {
name: '确认',
value: 'ok'
}] : [{
name: '详情',
value: 'detail'
}]
});
},
onClearPark() {
const that = this;
this.setData({ park: "", parkName: "", meter: "", meterName: "" }, () => {
loadingFunc(async () => {
await that.init()
})
})
},
onClearMeter() {
const that = this;
this.setData({ meter: "", meterName: "" }, () => {
loadingFunc(async () => {
await that.init()
})
})
},
onClearType() {
const that = this;
this.setData({ noticeFlowType: "", noticeFlowTypeName: "" }, () => {
loadingFunc(async () => {
await that.init()
})
})
},
onClearStatus() {
const that = this;
this.setData({ noticeFlowStatus: "", noticeFlowStatusName: "" }, () => {
loadingFunc(async () => {
await that.init()
})
})
},
hideActionMenu() {
this.setData({
currentActionSheet: ""
});
},
onMenuSelect(e) {
const {
value
} = e.detail;
const id = e.currentTarget.dataset.id;
switch(value) {
case "detail":
this.jumpToDetail(id);
break;
case "ok":
this.handleDoNotice(id);
break;
}
},
handleDoNoticeBtn(e) {
const id = e.currentTarget.dataset.id;
this.handleDoNotice(id)
},
async handleDoNotice(id) {
const { code, message } = await doNoticeFlow(id)
if (code !== OK) {
alertInfo(message)
return
}
alertSuccess("确认成功")
const that = this;
setTimeout(() => {
that.init();
}, 300)
},
jumpToDetail(id) {
wx.navigateTo({
url: '/pages/workOrderDetail/index?id=' + id,
})
},
listJumpToDetail(e) {
const { id } = e.currentTarget.dataset;
wx.navigateTo({
url: '/pages/workOrderDetail/index?id=' + id,
})
},
onConfirm(e) {
const { type, data = {}, way } = e.detail;
const that = this;
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 "noticeFlowType":
this.setData({
noticeFlowType: way,
noticeFlowTypeName: data,
page: 1,
}, () => {
loadingFunc(async () => {
await that.init()
})
});
break;
case "noticeFlowStatus":
this.setData({
noticeFlowStatus: way,
noticeFlowStatusName: data,
page: 1,
}, () => {
loadingFunc(async () => {
await that.init()
})
});
break;
case "workOrderMeter":
this.setData({
meter: data?.meter_id,
meterName: data?.address,
meterInfo: data,
page: 1,
}, () => {
loadingFunc(async () => {
await that.init()
})
});
break;
}
this.onCancel();
},
onCancel() {
this.setData({
show: false,
title: "",
type: "",
})
},
onParkFocus(e) {
this.setData({
show: true,
title: "园区",
type: 'park'
})
},
onNoticeFlowFocus() {
this.setData({
show: true,
title: "类型",
type: 'noticeFlowType'
})
},
onNoticeFlowStatusFocus() {
this.setData({
show: true,
title: "确认状态",
type: 'noticeFlowStatus'
})
},
onMeterFocus(e) {
const { park } = this.data;
if (!park) {
alertInfo("请先选择园区")
return;
}
this.setData({
show: true,
title: "电表",
type: 'workOrderMeter'
})
},
onChangePage(e) {
const that = this;
this.setData({
page: e.detail.currentIndex,
}, () => {
loadingFunc(async () => {
await that.init()
})
})
},
async init() {
const { page, size, park, tenement = "", meter = "", noticeFlowType, noticeFlowStatus, time } = this.data;
const { code, message, data, total } = await getWorkOrderList({ page, size, park, tenement, meter, type: noticeFlowType, time, status: noticeFlowStatus })
if (code !== OK) {
alertInfo(message)
return;
}
this.setData({
list: Array.isArray(data) ? data?.map(item => {
item.time = item?.created_at?.slice(0, 10)
item.address = item?.target?.meter_data?.address;
return item;
}) : [],
totalPage: Math.ceil(total / size),
})
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
@@ -26,7 +253,9 @@ Page({
* 生命周期函数--监听页面显示
*/
onShow() {
loadingFunc(async () => {
await this.init()
})
},
/**

View File

@@ -1,13 +1,23 @@
{
"usingComponents": {
"navigator": "/components/navigator/index",
"van-field": "@vant/weapp/field/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"
"searchSelectWrapper": "/components/searchSelectWrapper/index",
"van-empty": "@vant/weapp/empty/index",
"table": "/components/table/table",
"pagination": "/components/pagination/index",
"empty": "/components/empty/index",
"van-radio": "@vant/weapp/radio/index",
"van-radio-group": "@vant/weapp/radio-group/index",
"van-dialog": "@vant/weapp/dialog/index",
"van-icon": "@vant/weapp/icon/index",
"van-action-sheet": "@vant/weapp/action-sheet/index"
},
"navigationStyle": "custom"
}

View File

@@ -1,12 +1,109 @@
<!--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>
<searchSelectWrapper
label="选择园区"
placeholder="请选择园区"
text="{{parkName}}"
bind:search="onParkFocus"
allowClear="{{true}}"
bind:clear="onClearPark"
/>
<searchSelectWrapper
label="选择电表"
placeholder="请选择电表"
text="{{meterName}}"
bind:search="onMeterFocus"
allowClear="{{true}}"
bind:clear="onClearMeter"
/>
<searchSelectWrapper
label="流程类型"
placeholder="请选择流程类型"
text="{{noticeFlowTypeName}}"
bind:search="onNoticeFlowFocus"
allowClear="{{true}}"
bind:clear="onClearType"
/>
<searchSelectWrapper
label="确认状态"
placeholder="请选择确认状态"
text="{{noticeFlowStatusName}}"
bind:search="onNoticeFlowStatusFocus"
allowClear="{{true}}"
bind:clear="onClearStatus"
/>
<view>
<view wx:if="{{list.length}}">
<view class="tableWrapper">
<view class="table">
<view class="thead">
<view class="th" style="flex: 0 0 130rpx;"> 时间</view>
<view class="th" style="flex: 0 0 150rpx;"> 类型 </view>
<view class="th" style="flex: 0 0 150rpx;">电表地址</view>
<view class="th" style="flex: 0 0 150rpx;">状态</view>
<view class="th"style="flex: 0 0 120rpx; justify-content: flex-end; display: flex; align-items: center;"> 操作 </view>
</view>
<view class="tbody">
<view wx:for="{{list}}" wx:for-index="itemIndex" wx:key="item" catch:tap="listJumpToDetail" data-id="{{item.id}}">
<view class="tr" style="display: flex; align-items: center; ">
<view class="th" style="flex: 0 0 130rpx;">
{{ item.time }}
</view>
<view class="th" style="flex: 0 0 150rpx;">
{{ noticeFlowTypeList[item.types - 1] }}
</view>
<view class="th" style="flex: 0 0 150rpx;">
{{ item.address }}
</view>
<view class="th" style="flex: 0 0 150rpx;">
<view
class="primaryTextBtn"
wx:if="{{item.current_user_audit_status === 0}}"
data-id="{{item.id}}"
catch:tap="handleDoNoticeBtn"
> 确认 </view>
<view wx:else> 已确认 </view>
</view>
<view class="th" style="flex: 0 0 120rpx; justify-content: flex-end; display: flex; align-items: center;">
<van-icon name="ellipsis" size="24px" catch:tap="showActionMenu" data-id="{{item.id}}" data-data="{{index}}" data-status="{{item.current_user_audit_status}}" class="more-icon" />
<van-action-sheet
show="{{ currentActionSheet === item.id }}"
actions="{{ actionItems }}"
bind:close="hideActionMenu"
bind:select="onMenuSelect"
data-id="{{item.id}}"
close-on-click-action
/>
</view>
</view>
</view>
</view>
</view>
</view>
<pagination currentIndex="{{page}}" totalPage="{{totalPage}}" bind:pagingChange="onChangePage" />
</view>
<empty bind:refresh="init" wx:else />
</view>
<search-select
show="{{show}}"
title="{{title}}"
type="{{type}}"
park="{{park}}"
bindconfirm="onConfirm"
bindcancel="onCancel"
wx:if="{{show}}"
/>
</view>

View File

@@ -1 +1,71 @@
/* pages/workBenchTodoList/index.wxss */
/* pages/workBenchTodoList/index.wxss */
.table {
width: 500rpx;
}
.tableWrapper {
width: 100vw;
overflow-x: auto;
}
.thead {
display: flex;
flex-wrap: nowrap;
}
.thead .th {
padding: 10rpx;
white-space: nowrap;
text-align: center;
box-sizing: border-box;
}
.primaryTextBtn {
color: #1989fa;
}
.tbody {
width: 500rpx;
}
.tbody .tr {
padding: 10rpx;
border-bottom: 1rpx solid #EEEEEE;
display: flex;
align-items: center;
flex-wrap: nowrap;
}
.tbody .tr {
word-break: break-all;
text-align: center;
}
.more-icon {
padding: 20rpx;
color: #1989fa;
display: flex;
justify-content: center;
align-items: center;
}
/* 基础标签样式 */
.tag {
display: inline-block;
padding: 4px 5px;
margin-right: 0px;
border-radius: 16px;
background: #07c160;
color: white;
font-size: 25rpx;
}
/* 激活状态样式 */
.tag.active {
background: #07c160;
color: white;
}

View File

@@ -0,0 +1,119 @@
import { loadingFunc, alertSuccess, alertInfo } from "../../utils/index";
import request from "../../utils/request"
import { getNoticeFlowDetail, doNoticeFlow } from "../../service/workBench"
const { OK } = request;
// pages/workOrderDetail/index.js
Page({
/**
* 页面的初始数据
*/
data: {
detail: {},
header: [
// { key: 'address', title: '电表地址', renderBody: (item) => item.meter?.address },
{ title: '操作人',renderBody: (item) => { return item.user_name } },
{ title: '状态',renderBody: (item) => { return item.status === 0 ? "未确认" : "已确认" } },
],
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
const { id } = options;
const that = this;
loadingFunc(async () => {
that.getDetail(id)
})
},
showImage() {
this.setData({
imageShow: true
})
},
onClose() {
this.setData({
imageShow: false
})
},
goback() {
wx.navigateBack();
},
async onSubmit() {
const {detail} = this.data;
const {id} = detail;
const { code, message } = await doNoticeFlow(id)
if (code !== OK) {
alertInfo(message)
return
}
alertSuccess("确认成功")
const that = this;
setTimeout(() => {
loadingFunc(async () => {
await that.getDetail(id)
})
}, 300)
},
async getDetail(id) {
const { code, data ,message } = await getNoticeFlowDetail(id)
if (code !== OK) {
alertInfo(message)
return;
}
this.setData({
detail: data
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})

View File

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

View File

@@ -0,0 +1,93 @@
<!--pages/workOrderDetail/index.wxml-->
<navigator title="工单详情" canBack="{{true}}" />
<view>
<van-field
value="{{ detail.target.meter_data.park_name || '-' }}"
label="园区"
readonly
title-width="132rpx"
/>
<van-field
value="{{ detail.target.full_name || '-' }}"
label="商户全称"
readonly
title-width="132rpx"
/>
<van-field
value="{{ detail.target.meter_data.meter_sn || '-' }}"
label="电表编号"
readonly
title-width="132rpx"
/>
<van-field
value="{{ detail.target.meter_data.address || '-' }}"
label="电表地址"
readonly
title-width="132rpx"
/>
<van-field
label="图片"
title-width="132rpx"
>
<view slot="input" >
<view style="display: flex; align-items: center;" wx:if="{{detail.images}}">
<van-image width="100" height="100" src="{{detail.images}}" bind:tap="showImage" />
</view>
<view wx:else> - </view>
</view>
</van-field>
<van-field
value="{{ detail.created_at || '-' }}"
label="发起时间"
readonly
title-width="132rpx"
/>
<van-field
value="{{ detail.created_name || '-' }}"
label="发起人"
readonly
title-width="132rpx"
/>
<!-- <van-field
value="{{ detail.target.meter_data.meter_sn || '-' }}"
label="电表编号"
readonly
title-width="132rpx"
/> -->
<van-field
value="{{ detail.reason || '-' }}"
label="批注"
readonly
title-width="132rpx"
/>
<van-field
value="{{ detail.current_user_audit_status === 0 ? '未确认' : '已确认' }}"
label="工单状态"
readonly
title-width="132rpx"
/>
<view style="margin: 20rpx;">
<custom-table header="{{header}}" list="{{detail.notifier}}" />
</view>
<view class="wrapper">
<view class="operate">
<view class="submit" wx:if="{{detail.current_user_audit_status === 0}}"> <van-button type="info" block bind:click="onSubmit"> 确认 </van-button> </view>
<view class="cancel"> <van-button block bind:tap="goback"> 返回 </van-button> </view>
</view>
</view>
</view>
<van-popup
show="{{ imageShow }}"
bind:close="onClose"
z-index="99999"
>
<van-image
width="100vw"
height="99.1vh"
fit="contain"
src="{{detail.images}}"
bind:click="onClose"
/>
</van-popup>

View File

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

View File

@@ -23,6 +23,34 @@
"condition": {
"miniprogram": {
"list": [
{
"name": "pages/invoiceList/index",
"pathName": "pages/invoiceList/index",
"query": "",
"launchMode": "default",
"scene": null
},
{
"name": "pages/workBenchNew/components/installMeter/index",
"pathName": "pages/workBenchNew/components/installMeter/index",
"query": "",
"launchMode": "default",
"scene": null
},
{
"name": "pages/workBenchTodoList/index",
"pathName": "pages/workBenchTodoList/index",
"query": "",
"launchMode": "default",
"scene": null
},
{
"name": "pages/workOrderDetail/index",
"pathName": "pages/workOrderDetail/index",
"query": "id=NM00123091982548993",
"launchMode": "default",
"scene": null
},
{
"name": "pages/workBenchTodoList/index",
"pathName": "pages/workBenchTodoList/index",

View File

@@ -37,14 +37,20 @@ export const getBackTenementMeters = async function(park, tenement) {
export const handleOperateMeterSwitch = async function({ ids = [], status }) {
return await PUT(`/equipment/batchSwtich`, { ids, status });
}
// 预付费模式
export const handleOperateMeterMode = async function({ ids = [], mode, days, images, reason }) {
return await PUT(`/equipment/batchSetMode`, { ids, mode, days, images, reason });
}
// 绑定时获取电表的最新信息
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 getParkBoxList = async function({park = "", keyword = "", page = 1, building =- ""}) {
return await GET(`/box/${park}?page=${page}&keyword=${replaceSpecialIcon(keyword)}&building=${building}`);
}
// 获取卡列表
@@ -60,11 +66,26 @@ export const getCollectionList = async function({park = "", keyword = "", page =
// 获取库存电表列表
export const getInventoryMeter = async function({park = "", keyword = "", page = 1}) {
return await GET(`/electricity/list?page=${page}&park=${park}&keyword=${replaceSpecialIcon(keyword)}`);
export const getInventoryMeter = async function({park = "", keyword = "", page = 1, status = 1}) {
return await GET(`/electricity/list?page=${page}&park=${park}&keyword=${replaceSpecialIcon(keyword)}&status=${status}`);
}
// 新装电表
export const installMeter = async function(data) {
return await POST(`/wx/workBench/installMeter`, data);
}
// 拆表
export const uninstallMeter = async function(data) {
return await POST(`/flow/doMeterRemoveApproval`, data);
}
// 获取商户下的电表,后台
export const getCollectorList = async function(keyword) {
return await GET(`/collector/list?collectorAddress=${replaceSpecialIcon(keyword)}`);
}
// 微信工单列表查询所有电表
export const getWorkOrderAllMeter = async function({ keyword, park, page = 1, size = 20 }) {
return await GET(`/vx/getAllMeter?keyword=${replaceSpecialIcon(keyword)}&pid=${park}&page=${page}&size=${size}`,);
}

View File

@@ -63,6 +63,45 @@ export const uploadInstallMeter = (filePath) => {
})
}
export const uploadMeterForce = (filePath) => {
const { api } = getConfigByEnv();
return new Promise((resolve, reject) => {
wx.uploadFile({
filePath: filePath,
name: 'data',
url: `${api}/image/meter/force`,
header: {
authorization: 'Bearer ' + wx.getStorageSync("token")
},
success: (res) => {
resolve(res?.data ? JSON.parse(res?.data) : res?.data);
},
fail: (err) => {
reject(err);
}
})
})
}
export const uploadUninstallMeter = (filePath) => {
const { api } = getConfigByEnv();
return new Promise((resolve, reject) => {
wx.uploadFile({
filePath: filePath,
name: 'data',
url: `${api}/image/meter/delete`,
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

@@ -49,4 +49,22 @@ export const checkReadingFinish = async function(id) {
// 获取工作台首页
export const getWorkBenchHome = async function() {
return await GET(`/workHome/mainPage`,);
}
}
// 获取工单列表
export const getWorkOrderList = async function({
page, size, park = "", meter = "", tenement = "", status = "", type = "", time = ""
}) {
return await GET(`/noticeFlow/getDisposeList?page=${page}&size=${size}&park=${park}&meter=${meter}&tenement=${tenement}&status=${status}&type=${type}&time=${time}`,);
}
// 确认当前流程
export const doNoticeFlow = async function(id) {
return await PUT(`/noticeFlow/${id}/meter/dispose`,);
}
// 当前流程详情
export const getNoticeFlowDetail = async function(id) {
return await GET(`/noticeFlow/${id}/detail`,);
}

View File

@@ -11,4 +11,9 @@ export const getRechargeOperateWay = (num) => {
export const feeType = ['华昌宝能收费', "物业代收1", "物业代收2", "物业代收线损"]
export const meterType = ['商户电表', '园区电表', '公摊电表']
export const meterType = ['商户电表', '园区电表', '公摊电表']
export const noticeFlowType = ['拆表', '装表', '开户', "解绑", "绑定"]
export const noticeFlowStatus = ["已确认", "待确认"]
export const meterMode = ["预付费", "强控", "临时强控"]

View File

@@ -48,7 +48,7 @@ export function getConfigByEnv() {
api = "http://localhost:8000"
// api = "https://zgd.hbhcbn.com/api3"
// TODO: 发布正式时使用此路径
// api = "https://zgd.hbhcbn.com/wxApi"
// api = "https://zgd.hbhcbn.com/wxApi"
// api = "http://127.0.0.1:4523/m1/4143821-0-default"
break;
// 体验版