协议提交

master
lion 12 months ago
parent d27b84db97
commit 32809d8fa9

@ -19,8 +19,13 @@
"type" : "uniCloud"
},
{
"customPlaygroundType" : "local",
"playground" : "custom",
"type" : "uni-app:app-android"
},
{
"playground" : "standard",
"type" : "uni-app:app-ios"
}
]
}

@ -2,8 +2,8 @@
"name" : "护工管理",
"appid" : "__UNI__9CCCCC8",
"description" : "",
"versionName" : "1.1.4",
"versionCode" : 114,
"versionName" : "1.1.5",
"versionCode" : 115,
"transformPx" : false,
/* 5+App */
"app-plus" : {

@ -16,22 +16,24 @@
<view class="btn btnConfirm" @click="bindAction" data-type='toAssign' :data-id='order.id'
v-if="order.status==0||order.status==10">
<text class="btnTxt btnConfirmTxt">派单</text>
</view>
</view>
<!-- order.paramedic_id && (!order.order_agreements || order.order_agreements.length === 0 || (order.order_agreements.length > 0 && order.order_agreements[0].paramedic_id !== order.paramedic_id)) -->
<view class="btn btnConfirm" @click="bindAction" data-type='toSign' :data-id='order.id'
v-if="order.paramedic_id && (!order.order_agreements || order.order_agreements.length === 0 || (order.order_agreements.length > 0 && order.order_agreements[0].paramedic_id !== order.paramedic_id))">
v-if="order.need_agreements">
<text class="btnTxt btnConfirmTxt">签订协议</text>
</view>
</view>
<!-- order.status==20 && !(order.paramedic_id && (!order.order_agreements || order.order_agreements.length === 0 || (order.order_agreements.length > 0 && order.order_agreements[0].paramedic_id !== order.paramedic_id))) -->
<view class="btn btnConfirm" style="background-color: #3C91F5;border-color: #3C91F5;"
@click="bindAction" data-type='toZhongBuget' :data-id='order.id'
v-if="order.status==20 && !(order.paramedic_id && (!order.order_agreements || order.order_agreements.length === 0 || (order.order_agreements.length > 0 && order.order_agreements[0].paramedic_id !== order.paramedic_id)))">
v-if="order.status==20 && !order.need_agreements">
<text class="btnTxt btnConfirmTxt">中途结算</text>
</view>
<view class="btn btnConfirm" @click="bindAction" data-type='toBuget' :data-id='order.id'
v-if="order.status==20 && !(order.paramedic_id && (!order.order_agreements || order.order_agreements.length === 0 || (order.order_agreements.length > 0 && order.order_agreements[0].paramedic_id !== order.paramedic_id)))">
v-if="order.status==20 && !order.need_agreements">
<text class="btnTxt btnConfirmTxt">结算</text>
</view>
<view class="btn btnPay" @click="bindAction" data-type='toPay' :data-id='order.id'
v-if="!(order.paramedic_id && (!order.order_agreements || order.order_agreements.length === 0 || (order.order_agreements.length > 0 && order.order_agreements[0].paramedic_id !== order.paramedic_id)))">
v-if="!order.need_agreements">
<text class="btnTxt btnConfirmTxt">收款</text>
</view>
</view>

Binary file not shown.

After

Width:  |  Height:  |  Size: 426 KiB

@ -23,6 +23,7 @@
v-if="paramedicSignImage"
:src="paramedicSignImage"
class="signatureImage"
:style="getSignatureImageStyle(paramedicSignImage)"
mode="aspectFit">
</image>
</view>
@ -44,6 +45,7 @@
v-if="customerSignImage"
:src="customerSignImage"
class="signatureImage"
:style="getSignatureImageStyle(customerSignImage)"
mode="aspectFit">
</image>
</view>
@ -136,13 +138,6 @@
<view class="popupContent">
<view class="signatureWorkspace">
<view class="signatureInlineToast" v-if="signatureToastVisible">{{ signatureToastText }}</view>
<view class="signatureControlsRow">
<view class="signatureControlsRowInner">
<view class="btnRow btnRowClear" @click="clearPopupSignature"><view></view><view></view></view>
<view class="btnRow btnRowReset" @click="resetPopupSignature"><view></view><view></view></view>
<view class="btnRow btnRowSave" @click="savePopupSignature"><view></view><view></view></view>
</view>
</view>
<view class="signatureCanvasWrap">
<l-signature
ref="popupSignatureRef"
@ -154,10 +149,15 @@
class="signatureCanvas">
</l-signature>
</view>
<view class="signatureControlsRow">
<view class="btnRow btnRowClear" @click="clearPopupSignature"></view>
<view class="btnRow btnRowReset" @click="resetPopupSignature"></view>
<view class="btnRow btnRowSave" @click="savePopupSignature"></view>
</view>
</view>
</view>
</view>
</uni-popup>
</view>
</uni-popup>
</view>
</template>
@ -179,7 +179,7 @@
companySignId: "",
paramedicSignImage: "", //
customerSignImage: "", //
companySignImage: require('@/static/companySign.png'), //
companySignImage: '', //
//
agreementImage: "", //
agreementId: "", // ID
@ -201,7 +201,7 @@
signatureToastText: ''
}
},
onLoad: function(option) {
onLoad: function(option) {
var that = this;
that.id = option.id;
util.getOrderInfo(option.id, function(r) {
@ -229,9 +229,8 @@
},
//
initCompanySign: function(){
// IDID
// ID使
this.companySignImage = require('@/static/companySign.png');
// 使
this.companySignImage = 'https://tiantianxinye.365care.langye.net/h5/static/companySign.png';
this.companySignId = 'STATIC_COMPANY_SIGN';
},
tohome:function(){
@ -358,7 +357,7 @@
this.$refs.popupSignatureRef.canvasToTempFilePath({
quality: 0.9,
success: (res)=>{
//
// 使
this.rotateImageToLandscape(res.tempFilePath, (rotatedDataUrl)=>{
const uploadPath = rotatedDataUrl || res.tempFilePath;
this.uploadSignature(uploadPath, type, ()=>{
@ -375,43 +374,13 @@
}
},
// -90 dataURL
// 使
rotateImageToLandscape: function(filePath, callback){
try{
const img = new Image();
// canvasdataURL
img.crossOrigin = 'anonymous';
img.onload = () => {
const isPortrait = img.height > img.width;
if(!isPortrait){
//
callback(null);
return;
}
const canvas = document.createElement('canvas');
// -90
canvas.width = img.height;
canvas.height = img.width;
const ctx = canvas.getContext('2d');
ctx.fillStyle = '#ffffff';
ctx.fillRect(0, 0, canvas.width, canvas.height);
// 90°(0,0)
ctx.translate(0, canvas.height);
ctx.rotate(-90 * Math.PI/180);
ctx.drawImage(img, 0, 0);
const dataUrl = canvas.toDataURL('image/png', 0.92);
callback(dataUrl);
};
img.onerror = () => {
// 使
callback(null);
};
img.src = filePath;
}catch(e){
callback(null);
}
console.log('使用原图,不进行旋转:', filePath);
// null使
callback(null);
},
//
clearSignature: function(type) {
const refName = type + 'SignatureRef';
@ -421,6 +390,15 @@
}
},
//
getSignatureImageStyle: function(imagePath) {
// 使
return {
width: '120px',
height: '60px'
};
},
//
saveSignature: function(type) {
const refName = type + 'SignatureRef';
@ -533,22 +511,42 @@
console.log('开始上传签名:', type, filePath);
// dataURL
// dataURL
const doUpload = (pathToUpload) => {
uni.uploadFile({
url: util.HOST + 'manager/upload-image',
uni.uploadFile({
url: util.HOST + 'manager/upload-image',
filePath: pathToUpload,
name: 'file',
formData: {
'token': user.access_token,
'folder': 'public'
},
success(res) {
name: 'file',
formData: {
'token': user.access_token,
'folder': 'public'
},
success(res) {
console.log('签名上传响应:', res);
if (res.statusCode == "200") {
console.log('响应状态码:', res.statusCode);
console.log('响应数据类型:', typeof res.data);
console.log('响应数据内容:', res.data);
if (res.statusCode == 200 || res.statusCode == "200") {
try {
var mod = JSON.parse(res.data);
console.log('签名上传成功:', mod);
//
let mod;
if (typeof res.data === 'string') {
mod = JSON.parse(res.data);
} else if (typeof res.data === 'object') {
mod = res.data;
} else {
throw new Error('响应数据格式不支持');
}
console.log('解析后的数据:', mod);
//
if (!mod.id || !mod.public_path) {
console.log('响应数据缺少必要字段:', mod);
util.alert('签名上传失败:响应数据格式不完整');
return;
}
// ID
switch(type) {
@ -569,7 +567,8 @@
callback(mod.id);
} catch (error) {
console.log('解析上传响应失败:', error);
util.alert('签名上传失败:响应格式错误');
console.log('原始响应数据:', res.data);
// util.alert(' - ' + error.message);
}
} else {
console.log('签名上传失败,状态码:', res.statusCode);
@ -580,7 +579,7 @@
console.log('签名上传失败:', res);
util.alert('签名上传失败:网络错误');
}
});
});
};
if (typeof filePath === 'string' && filePath.startsWith('data:')) {
@ -601,7 +600,8 @@
util.alert("请完成所有签名并生成协议文件");
return;
}
console.log(that.paramedicSignId,that.customerSignId,that.companySignId,that.file_id)
return
util.request({
api: 'manager/create-order-agreements',
method: 'POST',
@ -728,14 +728,22 @@
var that = this;
let content = that.order.project.content;
//
const getSignatureImgStyle = function(imagePath) {
if (!imagePath) return '';
// 使
return 'vertical-align: middle; display: inline-block; width: 50px; height: 20px; margin: 0 5px;';
};
//
const placeholders = {
'paramedic_sign': that.paramedicSignImage ? `<img src="${that.paramedicSignImage}" alt="护工签名" style="display: inline-block; width: 50px; height: 20px; margin: 0 5px;">` : '',
'customer_sign': that.customerSignImage ? `<img src="${that.customerSignImage}" alt="客户签名" style="display: inline-block; width: 50px; height: 20px; margin: 0 5px;">` : '',
'paramedic_sign': that.paramedicSignImage ? `<img src="${that.paramedicSignImage}" alt="护工签名" style="${getSignatureImgStyle(that.paramedicSignImage)}">` : '',
'customer_sign': that.customerSignImage ? `<img src="${that.customerSignImage}" alt="客户签名" style="${getSignatureImgStyle(that.customerSignImage)}">` : '',
'company_sign': `<img class="company-stamp" src="${that.companySignImage}" alt="公司签名" style="display: inline-block;width: 80px;height: 80px;position: relative;left: -150px;margin: 0 5px;vertical-align: middle;">`,
'manage_sign': `<img class="company-stamp" src="${that.companySignImage}" alt="公司签名" style="display: inline-block; width: 80px;height: 80px;position: relative;left: -150px;margin: 0 5px;vertical-align: middle;">`,
'paramedic_sign2': that.paramedicSignImage ? `<img src="${that.paramedicSignImage}" alt="护工签名" style="display: inline-block; width: 50px; height: 20px; margin: 0 5px; margin-right: 54px;">` : '',
'customer_sign2': that.customerSignImage ? `<img src="${that.customerSignImage}" alt="客户签名" style="display: inline-block; width: 50px; height: 20px; margin: 0 5px; margin-right: 54px;">` : '',
'paramedic_sign2': that.paramedicSignImage ? `<img src="${that.paramedicSignImage}" alt="护工签名" style="${getSignatureImgStyle(that.paramedicSignImage)} margin-right: 54px;">` : '',
'customer_sign2': that.customerSignImage ? `<img src="${that.customerSignImage}" alt="客户签名" style="${getSignatureImgStyle(that.customerSignImage)} margin-right: 54px;">` : '',
'manage_sign2': `<img class="company-stamp" src="${that.companySignImage}" alt="公司签名" style="display: inline-block; width: 80px;height: 80px;position: relative;left: -150px;vertical-align: middle; margin: 0 5px; margin-right: 54px;">`,
'paramedic_sign_id': that.paramedicSignId || '',
'customer_sign_id': that.customerSignId || '',
@ -795,354 +803,79 @@
console.log('开始生成协议图片协议HTML内容:', that.agreementHtml);
console.log('协议HTML内容长度:', that.agreementHtml ? that.agreementHtml.length : 0);
// HTML
const tempContainer = document.createElement('div');
tempContainer.innerHTML = that.agreementHtml;
console.log('临时容器内容:', tempContainer.innerHTML);
console.log('临时容器文本内容:', tempContainer.textContent);
tempContainer.style.position = 'absolute';
tempContainer.style.left = '-9999px';
tempContainer.style.top = '-9999px';
tempContainer.style.zIndex = '-1';
tempContainer.style.width = '1000px';
tempContainer.style.minHeight = '1500px';
tempContainer.style.overflow = 'visible';
tempContainer.style.padding = '50px';
tempContainer.style.fontSize = '16px';
tempContainer.style.lineHeight = '1.8';
tempContainer.style.backgroundColor = '#ffffff';
tempContainer.style.border = '1px solid #ddd';
tempContainer.style.color = '#000000';
tempContainer.style.fontFamily = 'Arial, sans-serif';
tempContainer.style.wordWrap = 'break-word';
tempContainer.style.wordBreak = 'break-all';
tempContainer.style.overflowWrap = 'break-word';
// visibility: hiddenhtml2canvas
// 使访
// 使
that.generateAgreementByAPI();
},
// 使
generateAgreementByAPI: function() {
var that = this;
// DOM
document.body.appendChild(tempContainer);
// HTML
const fullHtml = `<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>协议</title>
</head>
<body style="font-family: 'SimSun', 'Microsoft YaHei', 'WenQuanYi Zen Hei', sans-serif;">
${that.agreementHtml}
</body>
</html>`;
// DOM
setTimeout(() => {
const containerWidth = tempContainer.scrollWidth;
const containerHeight = tempContainer.scrollHeight;
//
if (containerWidth > 1000 || containerHeight > 1500) {
tempContainer.style.width = Math.max(1000, containerWidth) + 'px';
tempContainer.style.minHeight = Math.max(1500, containerHeight) + 'px';
}
//
const images = tempContainer.querySelectorAll('img');
images.forEach((img, index) => {
// src
let rawSrc = img.getAttribute('src') || img.src || '';
rawSrc = this.normalizeUrl(rawSrc);
//
let fixedSrc = rawSrc.replace('//storage/', '/storage/');
// dataURL http(s)
const isHttp = /^https?:\/\//i.test(fixedSrc);
const isData = /^data:/i.test(fixedSrc);
// /storage/
if (!isHttp && !isData && /^\/?storage\//i.test(fixedSrc)) {
fixedSrc = fixedSrc.startsWith('/') ? fixedSrc : ('/' + fixedSrc);
fixedSrc = util.HOST.replace(/\/$/, '') + fixedSrc;
}
// /h5/static/
if (!isHttp && !isData && /^\/?h5\/static\//i.test(fixedSrc)) {
fixedSrc = fixedSrc.startsWith('/') ? fixedSrc : ('/' + fixedSrc);
const origin = (window && window.location && window.location.origin) ? window.location.origin : '';
fixedSrc = (origin || util.HOST.replace(/\/$/, '')) + fixedSrc;
}
//
img.src = this.normalizeUrl(fixedSrc);
console.log("img.src", img.src);
//
if (!img.classList.contains('company-stamp')) {
img.style.display = 'inline-block';
//
if (!img.style.width || img.style.width === '') img.style.width = '50px';
if (!img.style.height || img.style.height === '') img.style.height = '20px';
img.style.margin = '0 5px';
img.style.verticalAlign = 'middle';
// /
img.style.border = 'none';
img.style.backgroundColor = 'transparent';
//
img.style.opacity = '1';
} else {
//
img.style.border = 'none';
img.style.backgroundColor = 'transparent';
}
// CORS
// img.crossOrigin = 'anonymous';
//
img.loading = 'eager';
// 使
img.onerror = function() {
//
const placeholder = document.createElement('div');
placeholder.style.display = 'inline-block';
placeholder.style.width = '50px';
placeholder.style.height = '20px';
placeholder.style.margin = '0 5px';
placeholder.style.border = '1px solid #ddd';
placeholder.style.backgroundColor = '#f9f9f9';
placeholder.style.textAlign = 'center';
placeholder.style.lineHeight = '20px';
placeholder.style.fontSize = '12px';
placeholder.style.color = '#999';
placeholder.textContent = '签名';
img.parentNode.replaceChild(placeholder, img);
};
//
img.onload = function() {
//
};
});
//
const preloadImages = () => {
const imagePromises = Array.from(images).map(img => {
return new Promise((resolve, reject) => {
const src = img.getAttribute('src') || img.src || '';
const isHttp = /^https?:\/\//i.test(src);
let isSameOrigin = true;
try { isSameOrigin = new URL(src, window.location.href).origin === window.location.origin; } catch(e) {}
const finishWatch = () => {
if (img.complete && img.naturalWidth > 0 && img.naturalHeight > 0) {
resolve(img);
} else {
img.onload = () => resolve(img);
img.onerror = () => reject(img);
}
};
// / blob URL html2canvas tainted canvas
if (!img.classList.contains('company-stamp') && isHttp && !isSameOrigin && !img.dataset.blob) {
fetch(src, { mode: 'cors' })
.then(r => r.ok ? r.blob() : Promise.reject(r))
.then(b => {
const blobUrl = URL.createObjectURL(b);
img.src = blobUrl;
img.dataset.blob = '1';
finishWatch();
})
.catch(() => finishWatch());
} else {
finishWatch();
}
});
});
console.log('准备发送到接口的HTML内容:', fullHtml);
var user = uni.getStorageSync('userInfo');
//
uni.request({
url: util.HOST + 'manager/html-to-image',
method: 'POST',
header: {
'Content-Type': 'application/json',
Promise.allSettled(imagePromises).then(results => {
const successCount = results.filter(r => r.status === 'fulfilled').length;
// DOM
requestAnimationFrame(()=>setTimeout(generateCanvas, 100));
});
};
//
preloadImages();
}, 100);
function generateCanvas() {
//
const actualWidth = tempContainer.scrollWidth;
const actualHeight = tempContainer.scrollHeight;
console.log('准备生成Canvas容器尺寸:', actualWidth, 'x', actualHeight);
console.log('容器内容:', tempContainer.innerHTML);
console.log('容器可见性:', tempContainer.style.visibility);
console.log('容器位置:', tempContainer.style.left, tempContainer.style.top);
// 使html2canvas
// CORS
//
html2canvas(tempContainer, {
backgroundColor: '#ffffff',
scale: 1, // scale
useCORS: false, // CORS
allowTaint: false, // Tainted canvas
logging: false, //
removeContainer: false, //
foreignObjectRendering: false, // foreignObject
imageTimeout: 15000, //
width: Math.max(1000, actualWidth), //
height: Math.max(1500, actualHeight), //
scrollX: 0,
scrollY: 0
}).then(canvas => {
//
canvas.toBlob(blob => {
const file = new File([blob], 'agreement.png', { type: 'image/png' });
//
if (tempContainer.parentNode) {
document.body.removeChild(tempContainer);
}
},
data: {
html: fullHtml,
'token': user.access_token,
},
success: function(res) {
console.log('接口返回结果:', res);
if (res && res.statusCode === 200) {
//
const imageData = res.data;
that.agreementImage = util.HOST + imageData.public_path;
that.agreementId = imageData.id;
that.file_id = imageData.id;
console.log('协议生成成功:', imageData);
//
that.isGenerating = false;
that.generateButtonText = '生成协议';
that.uploadAgreementImage(file);
}, 'image/png', 0.9);
}).catch(error => {
let errorMessage = '协议生成失败';
if (error.message.includes('Tainted')) {
errorMessage = '由于图片跨域问题html2canvas无法生成协议将使用备用方法';
} else if (error.message.includes('SecurityError')) {
errorMessage = '由于安全限制html2canvas无法生成协议将使用备用方法';
//
that.closeAgreementPopup();
util.alert('协议生成成功');
} else {
errorMessage = 'html2canvas生成失败将使用备用方法生成协议图片';
console.log('接口返回错误:', res.data);
that.handleAgreementGenerationError(res.data ? res.data.message : '协议生成失败');
}
// 使
util.alert(errorMessage);
//
if (tempContainer.parentNode) {
document.body.removeChild(tempContainer);
}
//
that.isGenerating = false;
that.generateButtonText = '生成协议';
that.generateAgreementImageFallback();
});
}
},
fail: function(error) {
console.log('接口调用失败:', error);
that.handleAgreementGenerationError('网络请求失败');
}
});
},
// 使canvas
generateAgreementImageFallback: function() {
//
handleAgreementGenerationError: function(errorMessage) {
var that = this;
//
const measureContainer = document.createElement('div');
measureContainer.innerHTML = that.agreementHtml;
measureContainer.style.position = 'absolute';
measureContainer.style.left = '-9999px';
measureContainer.style.width = '1000px';
measureContainer.style.visibility = 'hidden';
document.body.appendChild(measureContainer);
//
that.isGenerating = false;
that.generateButtonText = '生成协议';
//
const actualWidth = Math.max(1000, measureContainer.scrollWidth);
const actualHeight = Math.max(1500, measureContainer.scrollHeight);
//
document.body.removeChild(measureContainer);
// canvas
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
// canvas
canvas.width = actualWidth;
canvas.height = actualHeight;
//
ctx.fillStyle = '#ffffff';
ctx.fillRect(0, 0, canvas.width, canvas.height);
//
ctx.fillStyle = '#000000';
ctx.font = '18px Arial';
ctx.textAlign = 'left';
// HTML
const tempDiv = document.createElement('div');
tempDiv.innerHTML = that.agreementHtml;
const plainText = tempDiv.textContent || tempDiv.innerText || '';
//
const lines = plainText.split('\n');
let y = 60;
const lineHeight = 30;
const maxWidth = canvas.width - 100;
lines.forEach((line, index) => {
if (line.trim()) {
//
if (ctx.measureText(line).width > maxWidth) {
let currentLine = '';
for (let i = 0; i < line.length; i++) {
const testLine = currentLine + line[i];
if (ctx.measureText(testLine).width > maxWidth) {
if (currentLine.trim()) {
ctx.fillText(currentLine.trim(), 50, y);
y += lineHeight;
}
currentLine = line[i];
} else {
currentLine += line[i];
}
}
if (currentLine.trim()) {
ctx.fillText(currentLine.trim(), 50, y);
y += lineHeight;
}
} else {
ctx.fillText(line, 50, y);
y += lineHeight;
}
} else {
y += lineHeight / 2;
}
});
//
y += 50;
ctx.font = '16px Arial';
ctx.fillStyle = '#666';
//
if (that.paramedicSignId) {
ctx.fillText(`护工签名ID: ${that.paramedicSignId}`, 50, y);
y += lineHeight;
}
if (that.customerSignId) {
ctx.fillText(`客户签名ID: ${that.customerSignId}`, 50, y);
y += lineHeight;
}
if (that.companySignId) {
ctx.fillText(`公司签名ID: ${that.companySignId}`, 50, y);
y += lineHeight;
}
//
y += 20;
const now = new Date();
const timeStr = `生成时间: ${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')} ${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}`;
ctx.fillText(timeStr, 50, y);
//
canvas.toBlob(blob => {
const file = new File([blob], 'agreement.png', { type: 'image/png' });
//
that.isGenerating = false;
that.generateButtonText = '生成协议';
that.uploadAgreementImage(file);
}, 'image/png', 0.9);
//
document.body.removeChild(tempDiv);
util.alert(errorMessage || '协议生成失败,请稍后重试');
},
//
@ -1190,7 +923,7 @@
that.isGenerating = false;
that.generateButtonText = '生成协议';
}
} else {
} else {
util.alert('协议生成失败:' + res.statusCode);
//
@ -1211,55 +944,208 @@
reader.readAsDataURL(file);
},
//
checkAgreementConsistency: function() {
//
submitAgreement: function() {
var that = this;
//
if (!that.paramedicSignId || !that.customerSignId || !that.companySignId || !that.file_id) {
util.alert("请完成所有签名并生成协议文件");
return;
}
util.request({
api: 'manager/create-order-agreements',
method: 'POST',
data: {
order_id: that.id,
paramedic_id: that.order.paramedic_id,
paramedic_sign_id: that.paramedicSignId,
customer_id: that.order.customer_id,
customer_sign_id: that.customerSignId,
//
company_sign_id: that.companySignId || 'STATIC_COMPANY_SIGN',
file_id: that.file_id
},
utilSuccess: function(r) {
util.alert("协议签订成功");
uni.navigateTo({
url: "/pages/order/order"
});
},
utilFail: function(r) {
util.alert(r);
}
});
},
//
previewAgreement: function() {
var that = this;
// companySignId
if (!that.paramedicSignId || !that.customerSignId) {
util.alert('请先完成所有签名');
return;
}
//
if (!that.order.project || !that.order.project.content) {
util.alert('还未上传协议,请联系管理员补充协议');
return;
}
//
that.processAgreementContent();
//
that.$refs.agreementPopup.open();
},
//
regenerateAgreement: function() {
var that = this;
//
if (that.paramedicSignId && that.customerSignId && that.companySignId && that.file_id) {
// IDID
//
if (that.agreementImage && that.file_id) {
//
//
that.agreementImage = "";
that.file_id = "";
that.agreementId = "";
console.log('检测到签名更改,已自动清除协议');
uni.showModal({
title: '提示',
content: "确定要重新生成协议吗?",
confirmText: "确定",
confirmColor: "#000",
cancelColor: "#eee",
success(res) {
if (res.confirm) {
//
that.agreementImage = "";
that.file_id = "";
that.agreementId = "";
//
that.previewAgreement();
}
}
});
},
//
viewAgreementFullscreen: function() {
var that = this;
if (that.agreementImage) {
uni.previewImage({
current: that.agreementImage,
urls: [that.agreementImage],
zIndex: 9999
});
}
},
//
checkAndClearAgreement: function(type) {
//
checkCanPreview: function() {
var that = this;
//
if (that.agreementImage && that.file_id) {
//
if (that.order.file_id) {
that.canPreview = true;
that.agreementImage = util.HOST + that.order.file_path;
that.agreementId = that.order.file_id;
} else {
that.canPreview = false;
that.agreementImage = "";
that.file_id = "";
that.agreementId = "";
// type
const typeNames = {
'paramedic': '护工',
'customer': '客户',
'company': '公司'
};
const typeName = typeNames[type] || type;
util.alert(typeName + '签名已更改,已自动清除已生成的协议,请重新生成协议');
}
},
//
autoClearAgreement: function() {
//
closeAgreementPopup: function() {
this.$refs.agreementPopup.close();
},
// ()
generateAgreement: function() {
var that = this;
if (that.agreementImage && that.file_id) {
//
that.agreementImage = "";
that.file_id = "";
that.agreementId = "";
util.alert("已自动清除已生成的协议,请签名后重新生成协议");
uni.showModal({
title: '提示',
content: "确定要重新生成协议吗?",
confirmText: "确定",
confirmColor: "#000",
cancelColor: "#eee",
success(res) {
if (res.confirm) {
that.submitAgreement(); //
util.alert('协议已重新生成,请刷新页面查看');
that.closeAgreementPopup(); //
}
}
});
},
//
processAgreementContent: function() {
var that = this;
let content = that.order.project.content;
//
const getSignatureImgStyle = function(imagePath) {
if (!imagePath) return '';
// 使
return 'vertical-align: middle; display: inline-block; width: 50px; height: 20px; margin: 0 5px;';
};
//
const placeholders = {
'paramedic_sign': that.paramedicSignImage ? `<img src="${that.paramedicSignImage}" alt="护工签名" style="${getSignatureImgStyle(that.paramedicSignImage)}">` : '',
'customer_sign': that.customerSignImage ? `<img src="${that.customerSignImage}" alt="客户签名" style="${getSignatureImgStyle(that.customerSignImage)}">` : '',
'company_sign': `<img class="company-stamp" src="${that.companySignImage}" alt="公司签名" style="display: inline-block;width: 80px;height: 80px;position: relative;left: -150px;margin: 0 5px;vertical-align: middle;">`,
'manage_sign': `<img class="company-stamp" src="${that.companySignImage}" alt="公司签名" style="display: inline-block; width: 80px;height: 80px;position: relative;left: -150px;margin: 0 5px;vertical-align: middle;">`,
'paramedic_sign2': that.paramedicSignImage ? `<img src="${that.paramedicSignImage}" alt="护工签名" style="${getSignatureImgStyle(that.paramedicSignImage)} margin-right: 54px;">` : '',
'customer_sign2': that.customerSignImage ? `<img src="${that.customerSignImage}" alt="客户签名" style="${getSignatureImgStyle(that.customerSignImage)} margin-right: 54px;">` : '',
'manage_sign2': `<img class="company-stamp" src="${that.companySignImage}" alt="公司签名" style="display: inline-block; width: 80px;height: 80px;position: relative;left: -150px;vertical-align: middle; margin: 0 5px; margin-right: 54px;">`,
'paramedic_sign_id': that.paramedicSignId || '',
'customer_sign_id': that.customerSignId || '',
'company_sign_id': that.companySignId || 'STATIC_COMPANY_SIGN',
'days': that.order.days || '',
'price': that.order.price || '',
'total': that.order.total || '',
'range_mobile': (that.order.project && that.order.project.range_mobile) || '',
'complaint_mobile': (that.order.project && that.order.project.complaint_mobile) || '',
'today_date': (() => {
const today = new Date();
return today.getFullYear() + '年' + (today.getMonth() + 1) + '月' + today.getDate() + '日';
})()
};
// HTML
Object.keys(placeholders).forEach(key => {
// {key} {<span>key</span>}
const regex = new RegExp(`\\{([^}]*${key}[^}]*)\\}`, 'g');
const matches = content.match(regex);
if (matches && matches.length > 0) {
content = content.replace(regex, placeholders[key]);
}
});
// text-wrap-mode: nowrap
content = content.replace(/text-wrap-mode:\s*nowrap;?/gi, '');
content = content.replace(/text-wrap-mode:\s*nowrap/gi, '');
that.agreementHtml = content;
},
//
generateAgreementImage: function() {
var that = this;
//
if (that.isGenerating) {
util.alert('正在生成协议,请稍候...');
return;
}
//
that.isGenerating = true;
that.generateButtonText = '生成中...';
//
setTimeout(() => {
that.startGenerateAgreement();
}, 500);
}
}
}
@ -1311,6 +1197,8 @@
border-radius: 8rpx;
background-color: #fff;
position: relative;
display: flex;
justify-content: center;
}
.signatureStart {
@ -1449,7 +1337,7 @@
/* 全屏签名弹窗内部 */
.signaturePopup {
width: 100vw;
height: 100vh;
height: 90vh;
background: #fff;
display: flex;
flex-direction: column;
@ -1457,17 +1345,15 @@
z-index: 9999;
}
.signatureWorkspace{display:flex;gap:20rpx;position:relative;}
/* 左侧区域内:横向排布再整体旋转 */
.signatureControlsRow{width: 140rpx;flex-shrink:0;display:flex;align-items:center;justify-content:center;}
.signatureControlsRowInner{display:flex;gap:20rpx;transform: rotate(90deg);transform-origin:center;}
.btnRow{margin:0 20rpx;display:flex;align-items:center;justify-content:center;padding: 20rpx 40rpx;border-radius: 999rpx;text-align:center;font-size: 26rpx;}
.btnRow view{margin:0 10rpx;}
.signatureWorkspace{display:flex;flex-direction:column;gap:20rpx;position:relative;height:100%;}
/* 下方按钮区域:横向排布 */
.signatureControlsRow{display:flex;align-items:center;justify-content:center;gap:20rpx;padding:20rpx 0;}
.btnRow{display:flex;align-items:center;justify-content:center;padding: 20rpx 40rpx;border-radius: 999rpx;text-align:center;font-size: 28rpx;min-width:120rpx;}
.btnRowClear{background:#f0f0f0;color:#333;border:2rpx solid #c84f3d;}
.btnRowSave{background:#0DC99E;color:#fff;}
.btnRowReset{background:#FFEFD9;color:#c84f3d;border:2rpx solid #f3c7a5;}
.signatureCanvasWrap{flex:1;}
.signatureCanvas {width: 100%;height: calc(100vh - 220rpx);background: #fff;border: 1px solid #eee;border-radius: 8rpx;}
.signatureCanvas {width: 100%;height: calc(100% - 100rpx)!important;background: #fff;border: 1px solid #eee;border-radius: 8rpx;}
/* 弹窗内提示,层级高于画布 */
.signatureInlineToast{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background: rgba(0,0,0,0.75);color:#fff;padding: 16rpx 24rpx;border-radius: 10rpx;font-size: 26rpx;z-index: 10;}
@ -1774,3 +1660,4 @@
}
}
</style>

@ -109,23 +109,26 @@
v-if="item.status==0||item.status==10">
<text class="btnTxt btnConfirmTxt">派单</text>
</view>
<view class="btn btnConfirm" @click="bindAction" data-type='toSign' :data-id='item.id'
v-if="item.paramedic_id && (!item.order_agreements || item.order_agreements.length === 0 || (item.order_agreements.length > 0 && item.order_agreements[0].paramedic_id !== item.paramedic_id))">
<!-- item.paramedic_id && (!item.order_agreements || item.order_agreements.length === 0 || (item.order_agreements.length > 0 && item.order_agreements[0].paramedic_id !== item.paramedic_id)) -->
<!-- -->
<view v-if="item.need_agreements" class="btn btnConfirm" @click="bindAction" data-type='toSign' :data-id='item.id'
>
<text class="btnTxt btnConfirmTxt">签订协议</text>
</view>
<!-- !(item.paramedic_id && (!item.order_agreements || item.order_agreements.length === 0 || (item.order_agreements.length > 0 && item.order_agreements[0].paramedic_id !== item.paramedic_id))) -->
<view class="btn btnConfirm" style="background-color: #3C91F5;border-color: #3C91F5;"
@click="bindAction" data-type='toZhongBuget' :data-id='item.id'
v-if="item.status==20 && !(item.paramedic_id && (!item.order_agreements || item.order_agreements.length === 0 || (item.order_agreements.length > 0 && item.order_agreements[0].paramedic_id !== item.paramedic_id)))">
v-if="item.status==20 && !item.need_agreements">
<text class="btnTxt btnConfirmTxt">中途结算</text>
</view>
<view class="btn btnConfirm" @click="bindAction" data-type='toBuget' :data-id='item.id'
v-if="item.status==20 && !(item.paramedic_id && (!item.order_agreements || item.order_agreements.length === 0 || (item.order_agreements.length > 0 && item.order_agreements[0].paramedic_id !== item.paramedic_id)))">
v-if="item.status==20 && !item.need_agreements">
<text class="btnTxt btnConfirmTxt">结算</text>
</view>
<view class="btn btnPay" @click="bindAction" data-type='toPay' :data-id='item.id'
v-if="!(item.paramedic_id && (!item.order_agreements || item.order_agreements.length === 0 || (item.order_agreements.length > 0 && item.order_agreements[0].paramedic_id !== item.paramedic_id)))">
v-if="!item.need_agreements">
<text class="btnTxt btnConfirmTxt">收款</text>
</view>
</view>

Binary file not shown.

@ -1 +1 @@
https://ide.dcloud.net.cn/build/download/ad0c54e0-1328-11ee-ad28-7fc2596e2b1e
https://app.liuyingyong.cn/build/download/6ec32240-a68f-11f0-8bbd-c7b8480f7cc1

File diff suppressed because one or more lines are too long

@ -1,3 +1,4 @@
andrCertfile=/Users/liuxiangyu/Work/客户文档/天天欣业/code/tiantiancare.appserver/unpackage/release/fd0f28d8af37480893b57ed92eef22b1.keystore
andrCertfile=/Users/mac/Documents/朗业/2025/s-四世同堂-天天欣业/fd0f28d8af37480893b57ed92eef22b1.keystore
andrCertAlias=care365
andrCertPass=c9Ai+2sDdZEeQt4xKAokFoa91CD6mZ+gxPEN+9aHqOc=
storePassword=c9Ai+2sDdZEeQt4xKAokFoa91CD6mZ+gxPEN+9aHqOc=

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

@ -0,0 +1,8 @@
var isReady=false;var onReadyCallbacks=[];
var isServiceReady=false;var onServiceReadyCallbacks=[];
var __uniConfig = {"pages":["pages/login/login","pages/index/index","pages/setting/setting","package/packageorder/pages/createorder/createorder","package/packageorder/pages/signOrder/signOrder","pages/order/order","pages/selectHospital/selectHospital","package/packageorder/pages/orderinfo/orderinfo","package/packagecarer/pages/carerlist/carerlist","package/packagecarer/pages/createcarer/createcarer","package/packagestat/pages/artboard/artboard","package/packagevideo/pages/videolist/videolist","package/packagevideo/pages/videoinfo/videoinfo","pages/pay/pay","package/packagestat/pages/stat/stat","package/packagecarer/pages/selectcarer/selectcarer","package/packagevideo/pages/news/news","package/packagevideo/pages/newsinfo/newsinfo","package/packagecarer/pages/carerinfo/carerinfo","package/packageorder/pages/suborderedit/suborderedit","package/packageorder/pages/assignorder/assignorder","package/packageorder/pages/budgetorder/budgetorder","package/packageorder/pages/finishorder/finishorder","package/packagestat/pages/statinfo/statinfo","package/packageorder/pages/changecarer/changecarer","pages/printSet/printSet","package/packageorder/pages/updateOtherOrder/updateOtherOrder"],"window":{"navigationBarTextStyle":"white","navigationBarTitleText":"天天欣业","navigationBarBackgroundColor":"#43C9CF","backgroundColor":"#f2f2f2"},"darkmode":false,"nvueCompiler":"uni-app","nvueStyleCompiler":"weex","renderer":"auto","splashscreen":{"alwaysShowBeforeRender":true,"autoclose":false},"appname":"护工管理","compilerVersion":"4.76","entryPagePath":"pages/login/login","networkTimeout":{"request":60000,"connectSocket":60000,"uploadFile":60000,"downloadFile":60000}};
var __uniRoutes = [{"path":"/pages/login/login","meta":{"isQuit":true},"window":{"navigationBarTitleText":"登录","enablePullDownRefresh":false,"navigationStyle":"custom"}},{"path":"/pages/index/index","meta":{},"window":{"navigationBarTitleText":"","enablePullDownRefresh":false,"navigationStyle":"custom"}},{"path":"/pages/setting/setting","meta":{},"window":{"navigationBarTitleText":"","enablePullDownRefresh":false,"navigationStyle":"custom"}},{"path":"/package/packageorder/pages/createorder/createorder","meta":{},"window":{"navigationBarTitleText":"","enablePullDownRefresh":false,"navigationStyle":"custom"}},{"path":"/package/packageorder/pages/signOrder/signOrder","meta":{},"window":{"navigationBarTitleText":"","enablePullDownRefresh":false,"navigationStyle":"custom"}},{"path":"/pages/order/order","meta":{"isNVue":true},"window":{"navigationBarTitleText":"","enablePullDownRefresh":false,"navigationStyle":"custom"}},{"path":"/pages/selectHospital/selectHospital","meta":{},"window":{"navigationBarTitleText":"","enablePullDownRefresh":false,"navigationStyle":"custom"}},{"path":"/package/packageorder/pages/orderinfo/orderinfo","meta":{},"window":{"navigationBarTitleText":"","enablePullDownRefresh":false,"navigationStyle":"custom"}},{"path":"/package/packagecarer/pages/carerlist/carerlist","meta":{},"window":{"navigationBarTitleText":"","enablePullDownRefresh":false,"navigationStyle":"custom"}},{"path":"/package/packagecarer/pages/createcarer/createcarer","meta":{},"window":{"navigationBarTitleText":"","enablePullDownRefresh":false,"navigationStyle":"custom"}},{"path":"/package/packagestat/pages/artboard/artboard","meta":{},"window":{"navigationBarTitleText":"","enablePullDownRefresh":false,"navigationStyle":"custom"}},{"path":"/package/packagevideo/pages/videolist/videolist","meta":{},"window":{"navigationBarTitleText":"","enablePullDownRefresh":false,"navigationStyle":"custom"}},{"path":"/package/packagevideo/pages/videoinfo/videoinfo","meta":{},"window":{"navigationBarTitleText":"","enablePullDownRefresh":false,"navigationStyle":"custom"}},{"path":"/pages/pay/pay","meta":{},"window":{"navigationBarTitleText":"","enablePullDownRefresh":false,"navigationStyle":"custom"}},{"path":"/package/packagestat/pages/stat/stat","meta":{},"window":{"navigationBarTitleText":"","enablePullDownRefresh":false,"navigationStyle":"custom"}},{"path":"/package/packagecarer/pages/selectcarer/selectcarer","meta":{},"window":{"navigationBarTitleText":"","enablePullDownRefresh":false,"navigationStyle":"custom"}},{"path":"/package/packagevideo/pages/news/news","meta":{},"window":{"navigationBarTitleText":"","enablePullDownRefresh":false,"navigationStyle":"custom"}},{"path":"/package/packagevideo/pages/newsinfo/newsinfo","meta":{},"window":{"navigationBarTitleText":"","enablePullDownRefresh":false,"navigationStyle":"custom"}},{"path":"/package/packagecarer/pages/carerinfo/carerinfo","meta":{},"window":{"navigationBarTitleText":"","enablePullDownRefresh":false,"navigationStyle":"custom"}},{"path":"/package/packageorder/pages/suborderedit/suborderedit","meta":{},"window":{"navigationBarTitleText":"","enablePullDownRefresh":false,"navigationStyle":"custom"}},{"path":"/package/packageorder/pages/assignorder/assignorder","meta":{},"window":{"navigationBarTitleText":"","enablePullDownRefresh":false,"navigationStyle":"custom"}},{"path":"/package/packageorder/pages/budgetorder/budgetorder","meta":{},"window":{"navigationBarTitleText":"","enablePullDownRefresh":false,"navigationStyle":"custom"}},{"path":"/package/packageorder/pages/finishorder/finishorder","meta":{},"window":{"navigationBarTitleText":"","enablePullDownRefresh":false,"navigationStyle":"custom"}},{"path":"/package/packagestat/pages/statinfo/statinfo","meta":{},"window":{"navigationBarTitleText":"","enablePullDownRefresh":true,"navigationStyle":"custom"}},{"path":"/package/packageorder/pages/changecarer/changecarer","meta":{},"window":{"navigationBarTitleText":"","enablePullDownRefresh":false,"navigationStyle":"custom"}},{"path":"/pages/printSet/printSet","meta":{},"window":{"navigationBarTitleText":"打印配置","enablePullDownRefresh":false}},{"path":"/package/packageorder/pages/updateOtherOrder/updateOtherOrder","meta":{},"window":{"navigationBarTitleText":"","enablePullDownRefresh":false,"navigationStyle":"custom"}}];
__uniConfig.onReady=function(callback){if(__uniConfig.ready){callback()}else{onReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"ready",{get:function(){return isReady},set:function(val){isReady=val;if(!isReady){return}const callbacks=onReadyCallbacks.slice(0);onReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});
__uniConfig.onServiceReady=function(callback){if(__uniConfig.serviceReady){callback()}else{onServiceReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"serviceReady",{get:function(){return isServiceReady},set:function(val){isServiceReady=val;if(!isServiceReady){return}const callbacks=onServiceReadyCallbacks.slice(0);onServiceReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});
service.register("uni-app-config",{create(a,b,c){if(!__uniConfig.viewport){var d=b.weex.config.env.scale,e=b.weex.config.env.deviceWidth,f=Math.ceil(e/d);Object.assign(__uniConfig,{viewport:f,defaultFontSize:Math.round(f/20)})}return{instance:{__uniConfig:__uniConfig,__uniRoutes:__uniRoutes,global:void 0,window:void 0,document:void 0,frames:void 0,self:void 0,location:void 0,navigator:void 0,localStorage:void 0,history:void 0,Caches:void 0,screen:void 0,alert:void 0,confirm:void 0,prompt:void 0,fetch:void 0,XMLHttpRequest:void 0,WebSocket:void 0,webkit:void 0,print:void 0}}}});

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -1 +1 @@
{"@platforms":["android","iPhone","iPad"],"id":"__UNI__EBB092D","name":"护工管理","version":{"name":"1.0.9","code":109},"description":"","launch_path":"__uniappview.html","developer":{"name":"","email":"","url":""},"permissions":{"Maps":{"coordType":"gcj02"},"LivePusher":{},"Bluetooth":{},"VideoPlayer":{},"Geolocation":{},"Camera":{},"UniNView":{"description":"UniNView原生渲染"}},"plus":{"useragent":{"value":"uni-app","concatenate":true},"splashscreen":{"autoclose":true,"delay":0,"target":"id:1","waiting":true},"popGesture":"close","launchwebview":{"render":"always","id":"1","kernel":"WKWebview"},"statusbar":{"immersed":"supportedDevice","style":"light","background":"#43C9CF"},"usingComponents":true,"nvueCompiler":"uni-app","compilerVersion":3,"distribute":{"icons":{"android":{"hdpi":"icon-android-hdpi.png","xhdpi":"icon-android-xhdpi.png","xxhdpi":"icon-android-xxhdpi.png","xxxhdpi":"icon-android-xxxhdpi.png"},"ios":{"iphone":{"app@2x":"static/logo.png","app@3x":"static/logo.png","notification@2x":"static/logo.png","notification@3x":"static/logo.png","settings@2x":"static/logo.png","settings@3x":"static/logo.png","spotlight@2x":"static/logo.png","spotlight@3x":"static/logo.png"},"prerendered":"false"}},"splashscreen":{"androidStyle":"default","android":{"hdpi":"splash-android-hdpi.png"}},"google":{"abiFilters":["armeabi-v7a","arm64-v8a","x86"],"permissions":["<uses-feature android:name=\"android.hardware.camera\"/>","<uses-feature android:name=\"android.hardware.camera.autofocus\"/>","<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>","<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>","<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>","<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>","<uses-permission android:name=\"android.permission.BIND_ACCESSIBILITY_SERVICE\"/>","<uses-permission android:name=\"android.permission.CAMERA\"/>","<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>","<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>","<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>","<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>","<uses-permission android:name=\"android.permission.INTERNET\"/>","<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>","<uses-permission android:name=\"android.permission.READ_LOGS\"/>","<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>","<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>","<uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\"/>","<uses-permission android:name=\"android.permission.VIBRATE\"/>","<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>","<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>","<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"],"packagename":"uni.UNIEBB092D","aliasname":"care365","password":"c9Ai+2sDdZEeQt4xKAokFoa91CD6mZ+gxPEN+9aHqOc=","keystore":"google-keystore.keystore","custompermissions":true},"apple":{"dSYMs":false,"idfa":true,"devices":"universal"},"plugins":{"ad":{},"audio":{"mp3":{"description":"Android平台录音支持MP3格式文件"}},"geolocation":{},"maps":{"amap":{"appkey_android":"62436a5415d8662429f444ee6d489c5c","appkey_ios":"tiantiancarer"},"description":"地图插件"}},"orientation":"portrait-primary"},"nativePlugins":{"Sunmi-Print-Inner":{}},"uniStatistics":{"enable":false},"allowsInlineMediaPlayback":true,"uni-app":{"compilerVersion":"3.8.4","control":"uni-v3","nvueCompiler":"uni-app","renderer":"auto","nvue":{"flex-direction":"column"},"nvueLaunchMode":"normal"},"launch_path":"__uniappview.html","adid":"127548130511"}}
{"@platforms":["android","iPhone","iPad"],"id":"__UNI__9CCCCC8","name":"护工管理","version":{"name":"1.1.5","code":115},"description":"","launch_path":"__uniappview.html","developer":{"name":"","email":"","url":""},"permissions":{"Maps":{"coordType":"gcj02"},"LivePusher":{},"Bluetooth":{},"VideoPlayer":{},"Geolocation":{},"Camera":{},"UniNView":{"description":"UniNView原生渲染"}},"plus":{"useragent":{"value":"uni-app","concatenate":true},"splashscreen":{"autoclose":true,"delay":0,"target":"id:1","waiting":true},"popGesture":"close","launchwebview":{"render":"always","id":"1","kernel":"WKWebview"},"statusbar":{"immersed":"supportedDevice","style":"light","background":"#43C9CF"},"usingComponents":true,"nvueCompiler":"uni-app","compilerVersion":3,"distribute":{"icons":{"android":{"hdpi":"icon-android-hdpi.png","xhdpi":"icon-android-xhdpi.png","xxhdpi":"icon-android-xxhdpi.png","xxxhdpi":"icon-android-xxxhdpi.png"},"ios":{"iphone":{"app@2x":"static/logo.png","app@3x":"static/logo.png","notification@2x":"static/logo.png","notification@3x":"static/logo.png","settings@2x":"static/logo.png","settings@3x":"static/logo.png","spotlight@2x":"static/logo.png","spotlight@3x":"static/logo.png"},"prerendered":"false"}},"splashscreen":{"androidStyle":"default","android":{"hdpi":"splash-android-hdpi.png"}},"google":{"abiFilters":["armeabi-v7a","arm64-v8a","x86"],"permissions":["<uses-feature android:name=\"android.hardware.camera\"/>","<uses-feature android:name=\"android.hardware.camera.autofocus\"/>","<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>","<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>","<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>","<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>","<uses-permission android:name=\"android.permission.BIND_ACCESSIBILITY_SERVICE\"/>","<uses-permission android:name=\"android.permission.CAMERA\"/>","<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>","<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>","<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>","<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>","<uses-permission android:name=\"android.permission.INTERNET\"/>","<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>","<uses-permission android:name=\"android.permission.READ_LOGS\"/>","<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>","<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>","<uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\"/>","<uses-permission android:name=\"android.permission.VIBRATE\"/>","<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>","<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>","<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"],"packagename":"uni.UNIEBB092D","aliasname":"care365","password":"c9Ai+2sDdZEeQt4xKAokFoa91CD6mZ+gxPEN+9aHqOc=","storepwd":"c9Ai+2sDdZEeQt4xKAokFoa91CD6mZ+gxPEN+9aHqOc=","keypwd":"c9Ai+2sDdZEeQt4xKAokFoa91CD6mZ+gxPEN+9aHqOc=","keystore":"google-keystore.keystore","custompermissions":true},"apple":{"dSYMs":false,"idfa":true,"devices":"universal"},"plugins":{"ad":{},"audio":{"mp3":{"description":"Android平台录音支持MP3格式文件"}},"geolocation":{},"maps":{"amap":{"appkey_android":"62436a5415d8662429f444ee6d489c5c","appkey_ios":"tiantiancarer"},"description":"地图插件"}},"orientation":"portrait-primary"},"nativePlugins":{"Sunmi-Print-Inner":{}},"uniStatistics":{"enable":false},"allowsInlineMediaPlayback":true,"uni-app":{"compilerVersion":"4.76","control":"uni-v3","nvueCompiler":"uni-app","renderer":"auto","nvue":{"flex-direction":"column"},"nvueLaunchMode":"normal"},"launch_path":"__uniappview.html","adid":"122299150103"}}

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 426 KiB

Before

Width:  |  Height:  |  Size: 121 KiB

After

Width:  |  Height:  |  Size: 121 KiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save