This commit is contained in:
boi 2025-06-18 01:26:40 +08:00
parent 08109a34e6
commit 50ac29eebd
18 changed files with 629 additions and 73 deletions

View File

@ -524,18 +524,18 @@
gap: 1em;
}
.yearmonth .today {
flex: none;
padding-right: 0.5em;
white-space: nowrap;
}
.yearmonth>.itm {
flex: 1;
display: flex;
align-items: center;
}
.yearmonth .today {
flex: none;
padding-right: 0.5em;
white-space: nowrap;
}
.yearmonth .maintxt {
flex: 1;
text-align: center;

View File

@ -5,7 +5,7 @@
<input v-if="hasmore" type="hidden" :name="name+'_unit'" :value="unit" style="display:none;" />
<ciy-input @change="chgnum" :disabled="disabled" style="width:4em;" v-model="num"></ciy-input>
<view class="_unit">
<ciy-select @change="chgunit" :disabled="disabled" v-model="unit" :rows="4" align="center" :range="range"></ciy-select>
<ciy-select @change="chgunit" :disabled="disabled" v-model="unit" :rows="trowcnt" align="center" :range="trange"></ciy-select>
</view>
</view>
</template>
@ -46,23 +46,14 @@
type: Boolean,
default: false
},
range: {
type: String,
default: 'month,day,min'
},
},
data() {
return {
v: '',
range: [{
id: 'month',
name: this.lang('cyc.month')
}, {
id: 'day',
name: this.lang('cyc.day')
}, {
id: 'min',
name: this.lang('cyc.min')
}, {
id: 'sec',
name: this.lang('cyc.sec')
}],
num: 0,
unit: ''
};
@ -85,12 +76,31 @@
return -this.toint(this.num);
} else if (this.unit == 'day') {
return this.toint(this.num) * 86400;
} else if (this.unit == 'hour') {
return this.toint(this.num) * 3600;
} else if (this.unit == 'min') {
return this.toint(this.num) * 60;
} else {
return this.num;
}
}
},
trange() {
var rg = [];
var rs = this.range.split(',');
for (var i = 0; i < rs.length; i++) {
rg.push({
id: rs[i],
name: this.lang('cyc.' + rs[i])
})
}
return rg;
},
trowcnt() {
var cnt = this.range.split(',').length;
if(cnt > 4)
return 3;
return cnt;
},
},
mounted() {
this.setvalue(this.value || this.modelValue);
@ -117,6 +127,9 @@
} else if (vi % 86400 == 0) {
unit = 'day';
num = this.toint(vi / 86400);
} else if (vi % 3600 == 0) {
unit = 'hour';
num = this.toint(vi / 3600);
} else if (vi % 60 == 0) {
unit = 'min';
num = this.toint(vi / 60);

View File

@ -74,9 +74,7 @@
}
},
mounted() {
if (this.initevent) {
this.emit(this.innervalue, 'init');
}
this.emit(this.innervalue, this.initevent ? 'init' : '');
},
methods: {
emit(val, from) {
@ -91,11 +89,13 @@
this.$emit('update:modelValue', val);
} else {}
this.tvalue = val;
this.$emit('change', {
name: this.name,
from: from,
value: val
});
if (from) {
this.$emit('change', {
name: this.name,
from: from,
value: val
});
}
this.old = val;
},
textinput(e) {

View File

@ -12,7 +12,7 @@
<script>
export default {
emits: ['change','update:modelValue'],
emits: ['change', 'update:modelValue'],
props: {
modelValue: {
type: [String, Number],
@ -31,7 +31,7 @@
default: ''
},
lis: {
type: Array,
type: [String, Array],
default: []
}
},
@ -76,6 +76,20 @@
id: '',
name: this.all
});
}
if (typeof(this.lis) == 'string') {
const lis = this.lis.split(',');
for (let i = 0; i < lis.length; i++) {
const ls = lis[i].split('.');
if (ls.length < 2)
continue;
lst.push({
id: ls[0],
name: ls[1]
});
}
}
if (this.isarray(this.lis)) {
for (var i = 0; i < this.lis.length; i++)

View File

@ -49,6 +49,7 @@
._defshow {
display: flex;
justify-content: flex-end;
flex-wrap: wrap;
}
._defshow._left {

View File

@ -0,0 +1,63 @@
<template>
<view style="display:inline-block;" :style="ciystyle">
<text :style="intstyle">{{p1}}</text>
<text :style="decstyle">{{p2}}</text>
<text :style="decstyle">{{unit}}</text>
</view>
</template>
<style scoped>
</style>
<script>
export default {
props: {
value: {
type: [String, Number],
default: 0
},
dec0: {
type: Boolean,
default: false
},
unit: {
type: String,
default: ''
},
ciystyle: {
type: String,
default: ''
},
intstyle: {
type: String,
default: ''
},
decstyle: {
type: String,
default: 'font-size:0.7em;'
},
},
data() {
return {};
},
watch: {},
computed: {
p1() {
if (this.unit == '万元')
return this.toint(this.value / 1000000);
else
return this.toint(this.value / 100);
},
p2() {
if (this.unit == '万元')
return this.tonumdec(this.value / 1000000, this.dec0, 3);
else if (this.unit == '元')
return this.tonumdec(this.value / 100, this.dec0, 2);
else
return this.tonumdec(this.value / 100, this.dec0, 2);
}
},
mounted() {},
methods: {}
}
</script>

View File

@ -102,7 +102,7 @@
},
data() {
return {
v: '',
v: false,
anidatabg: {},
anidatay: {},
anidatan: {},

View File

@ -800,7 +800,7 @@ export default {
this.sysinfo = app.globalData._sysinfo;
this.jsnurl = app.globalData.jsnurl;
this.me = this.getme();
if(app.globalData.ciy_page_g)
if (app.globalData.ciy_page_g)
this.g = app.globalData.ciy_page_g;
else
this.g = this.getstorage('g', {});
@ -833,6 +833,37 @@ export default {
opt.pagethis = this;
return getApp().callajax(opt);
},
calltxt(opt) {
return new Promise((resolve, reject) => {
opt = opt || {};
uni.request({
url: opt.url,
data: opt.data,
dataType: 'text',
method: opt.data ? 'POST' : 'GET',
header: opt.header,
fail: res => {
var errmsg = res.errMsg || 'nofind errMsg.';
if (errmsg.indexOf('fail abort') > 0)
errmsg = '网络信号不好';
else if (errmsg.indexOf('equest:fail timeout') > 0)
errmsg = '网络访问超时';
else if (errmsg.indexOf('equest:fail') > 0)
errmsg = '网络不可用';
return reject({
errmsg: errmsg
});
},
success: res => {
if (res.statusCode == 200)
return resolve(res.data);
return reject({
errmsg: res.data
});
}
});
});
},
getme() {
return getApp().getme();
},
@ -893,7 +924,7 @@ export default {
animationDuration: 1000
});
} else if (url.substring(0, 1) == '*') {
this.alert(dataset.url.substring(1));
this.alert(url.substring(1));
} else {
if (url.substring(0, 1) == '$') {
url = url.substring(1);
@ -1323,17 +1354,25 @@ export default {
},
tonumdec(num, showzero, len) {
len = len || 2; // 与tofix不同点小数长度不变如 1.10
var m2 = Math.ceil((num - parseInt(num)) * 100);
if (m2 < 10)
m2 = '0' + m2;
else
m2 = m2 + '';
if (showzero)
return '.' + m2;
if (m2 == '00')
return '';
else
return '.' + m2;
var m2 = Math.round((num - parseInt(num)) * Math.pow(10, len));
if (m2 == 0) {
if (showzero)
return '.' + '0'.repeat(len);
else
return '';
}
m2 = m2 + '';
if (m2.length < len)
m2 = '0'.repeat(len - m2.length) + m2;
return '.' + m2;
},
tocciy(cciy) {
var hex = cciy.toString(16).toUpperCase();
hex = hex.substring(hex.length - 12);
hex = hex.replace(/^0+/, '');
if (hex.length < 7)
hex = '0'.repeat(7 - hex.length) + hex;
return 'cx...' + hex.substring(0, hex.length - 1);
},
tostr(obj) {
if (!obj)

View File

@ -39,6 +39,7 @@
"query.btn_reset":"重置",
"query.btn_close":"关闭",
"page.btn_pub":"发布",
"page.btn_submit":"提交",
"page.btn_refresh":"刷新",
"page.loading":"加载中",
@ -79,6 +80,7 @@
"cyc.month": "月",
"cyc.day": "天",
"cyc.hour": "小时",
"cyc.min": "分钟",
"cyc.sec": "秒",

View File

@ -252,6 +252,23 @@ text {
opacity: 0.5;
}
.ciy-list .title {
position: relative;
color: var(--txt9);
font-weight: bold;
margin-left: 1em;
}
.ciy-list .title::before {
content: '';
position: absolute;
left: -1em;
width: 0.5em;
height: 1.5em;
border-radius: 5px;
background: linear-gradient(-60deg, var(--man4), var(--man7));
}
.ciy-list .l0 {
font-size: 0.8em;
padding-right: 6em;
@ -266,7 +283,6 @@ text {
.ciy-list .l2 {
display: flex;
align-items: center;
min-height: 2em;
}
.ciy-list .l2>label {
@ -952,27 +968,27 @@ text {
text-decoration: underline;
}
.txt-left {
.txt-left.txt-left {
text-align: left;
}
.txt-center {
.txt-center.txt-center {
text-align: center;
}
.txt-right {
.txt-right.txt-right {
text-align: right;
}
.txt-just {
.txt-just.txt-just {
text-align: justify;
}
.txt-nowrap {
.txt-nowrap.txt-nowrap {
white-space: nowrap;
}
.txt-over {
.txt-over.txt-over {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;

95
web/admin/ap/cash_ie.html Normal file
View File

@ -0,0 +1,95 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<link href="/jscss/style.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" charset="utf-8" src="/jscss/theme.js"></script>
</head>
<body>
<div class="container">
<form class="search" onsubmit="table.search(this,'btn');return false;">
<ul></ul>
<div>
<div class="sinps"></div>
<div class="sbtns">
<button class="lang btn" type="submit">查询</button>
<a class="lang btn" onclick="exportxls()">导出</a>
</div>
</div>
</form>
<div class="table">
<div class="loading col-24">Loading...</div>
<div class="list"></div>
<div>
<div class="btmbtn">
<a class="lang btn def" onclick="ciyfn.select_all(table)">全选</a>
<a class="lang btn def" onclick="ciyfn.select_diff(table)">反选</a>
|
<a class="lang btn dag" onclick="ciyfn.select_callfunc(table, this, 'del','已选{n}条,是否批量删除?', {},function(json){table.delline(json)})">批量删除</a>
</div>
<div class="page"></div>
</div>
</div>
</div>
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="/jscss/ciycmp.js"></script>
<script type="text/javascript" src="/jscss/ciycmp2.js"></script>
<script type="text/javascript" src="/jscss/ciytable.js"></script>
<script type="text/javascript" src="../common.js"></script>
<script type="text/javascript">
'use strict';
var table;
var Glob = {};
ciyfn.pageload(function () {
//Glob.urlp = ciyfn.urlparam();
table = new ciyclass.table({
dom: '.table'
, url: 'list'
, pagecount: 10
, fn_beforedata: function (json) {
ciyfn.fillsearch({
searchdom: '.search'
, data: json
, liall: '全部'
, lidata: 'cashietype'
, liclick: function (dom) {
table.search(dom, 'li');
}
});
return json;
}
, fn_tdcontent: function (key, datashow, field, data) {
}
, fn_done: function (json) {
// table.mergecol('auditstatus');
// table.mergefix('总计', 'center', 6, 0, 8, 1);
// table.footertotal();
}
});
table.callpage(1);
});
function getdata(id, act, cb) {
ciyfn.callfunc('getdata', { id: id, act: act }, function (json) {
cb(json);
});
// cb({ data: id == 0 ? {} : table.data[id] });
}
function exportxls() {
ciyfn.table_exportxls('exportxls', table, function (json) {
ciyfn.alert({
content: '<div style="text-align:center;"><span class="lang">导出数据已生成</span><br/><br/><a class="lang btn lg" href="' + json.url + '" target="_blank">下载数据</a></div>'
, btns: null
});
});
}
</script>
</body>
</html>

185
web/admin/ap/cash_ie.php Normal file
View File

@ -0,0 +1,185 @@
<?php
namespace web\admin\ap;
class cash_ie {
static function setwhere($db, $post) {
$query = $post->get('query');
$csql = new \ciy\sql('ap_cash_ie');
$liid = objint($query, 'liid');
if ($liid > 0)
$csql->where('cashietype', $liid);
$val = objstr($query, 'vuser');
if (!empty($val)) {
$csqlt = new \ciy\sql('ap_user');
$csqlt->where('name like', $val);
$trow = $db->getone($csqlt);
if (is_array($trow)) {
$csql->where('vuser', $trow['id']);
$query['vuser'] = $trow['name'];
} else {
$csql->where('vuser=0');
}
}
$csql->wherenumrange('iemoney', objstr($query, 'iemoney_1'), objstr($query, 'iemoney_2'), 100);
$csql->wheredaterange('addtimes', objstr($query, 'addtimes'));
$csql->where('name like', objstr($query, 'name'));
$order = objstr($query, 'order', 'id desc');
$csql->order($order);
$query['order'] = $order;
return [$query, $csql];
}
public static function json_list() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
list($where, $csql) = self::setwhere($db, $post);
$pageno = $post->getint('pageno', 1);
$pagecount = $post->getint('pagecount', 10);
$csql->limit($pageno, $pagecount);
$mainrowcount = $post->getint('count');
$rows = $db->get($csql, $mainrowcount);
if($rows === false)
return errjson($db->error);
$ret = array('where' => $where, 'pageno' => $pageno, 'pagecount' => $pagecount, 'count' => $mainrowcount, 'list' => $rows);
if ($post->getbool('field')) {
$field = array();
$fshow = $db->getfield($field, 'ap_cash_ie');
foreach ($field as $fr => $v) {
if (get('_' . $fr))
$field[$fr]['c'] = ',' . $field[$fr]['c'];
}
$ret['field'] = $field;
$ret['fshow'] = $fshow;
}
if ($post->getbool('once')) {
$ret['once'] = array();
$input = array();
$input[] = array('type' => 'input', 'form' => 'vuser', 'name' => '所属用户', 'prop' => ' style="width:8em;"');
$input[] = array('type' => 'num', 'form' => 'iemoney', 'name' => '金额', 'prop' => ' style="width:4em;"');
$input[] = array('type' => 'daterange', 'form' => 'addtimes', 'name' => '发生时间');
$input[] = array('type' => 'input', 'form' => 'name', 'name' => '摘要', 'prop' => ' style="width:8em;"');
$ret['once']['input'] = $input;
}
$ret['ap_user'] = getrelation($db, $rows, 'ap_user', 'vuser');
return succjson($ret);
}
public static function json_getdata() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
$id = $post->getint('id');
$act = $post->get('act');
if ($id > 0) {
$csql = new \ciy\sql('ap_cash_ie');
$csql->where('id', $id);
$row = $db->getone($csql);
if (!is_array($row))
return errjson('数据不存在');
if ($act == 'view' || $act == 'review') {
$csql = (new \ciy\sql('ap_user'))->column('id,name');
$csql->where('id', $row['vuser']);
$ret['ap_user'] = $db->get($csql);
}
} else {
$row = array();
}
$ret['data'] = $row;
if ($act == 'edit') {
$csql = (new \ciy\sql('ap_user'))->column('id,name');
$ret['ap_user'] = $db->get($csql);
}
return succjson($ret);
}
public static function json_del() {
global $db;
$rsuser = verifyfast();
//if (nopower($db, $rsuser['id'], 'p d'))
// return errjson('您未被授权操作');
$post = new \ciy\post();
$ids = $post->get('ids');
if (empty($ids))
return errjson('请选择至少一条');
$csql = new \ciy\sql('ap_cash_ie');
$csql->where('id in', $ids);
$rows = $db->get($csql);
$vids = array();
try {
$db->begin();
foreach ($rows as $row) {
$delid = $row['id'];
//delcheck($db, $delid, 'tablexx', 'xxid', '管理员');
//delall($db, $delid, 'tablexx', 'xxid', '运动员'); //deltimeall
delme($db, $delid, 'ap_cash_ie');
savelogdb($db, $rsuser['id'], 'ap_cash_ie', $row, null);
$vids[] = $delid;
}
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;
return succjson($ret);
}
public static function json_exportxls() {
global $db;
$rsuser = verifyfast();
//if (nopower($db, $rsuser['id'], 'p e'))
// return errjson('您未被授权操作');
$post = new \ciy\post();
list($where, $csql) = self::setwhere($db, $post);
$rows = $db->get($csql);
if (count($rows) > 10000)
return errjson('将导出' . count($rows) . '条不建议超过1万条请筛选缩小范围');
$fields = array();
$fields[] = array('style' => 'l', 'width' => 60, 'field' => 'id', 'name' => '行码');
$fields[] = array('style' => 'l', 'width' => 100, 'field' => 'cashietype', 'name' => '收支分类');
$fields[] = array('style' => 'l', 'width' => 100, 'field' => 'vuser', 'name' => '所属用户');
$fields[] = array('style' => 'r', 'width' => 100, 'field' => 'iemoney', 'name' => '金额');
$fields[] = array('style' => 'l', 'width' => 100, 'field' => 'addtimes', 'name' => '发生时间');
$fields[] = array('style' => 'l', 'width' => 150, 'field' => 'name', 'name' => '摘要');
$code_cashietype = getcatas($db, 'cashietype');
$code_vuser = getrelation($db, $rows, 'ap_user', 'vuser', 'id,name');
$datas = array();
foreach ($rows as $row) {
$dat = array();
foreach ($fields as $field) {
$field = $field['field'];
$val = isset($row[$field]) ? $row[$field] : '';
if ($field == 'id')
$val = enid($val);
if ($field == 'cashietype')
$val = ccode($code_cashietype, $val);
if ($field == 'vuser')
$val = ccode($code_vuser, $val);
if ($field == 'iemoney')
$val = number_format($val / 100, 2);
if ($field == 'addtimes')
$val = ($val == 0 ? '--' : date('Y-m-d H:i', $val));
$dat[] = $val;
}
$datas[] = $dat;
}
$param = array();
$param['field'] = $fields;
$param['data'] = $datas;
$param['sheetname'] = '数据报表';
$param['titleheight'] = '25'; //列头高度
$param['landscape'] = true; //横向打印
$param['fixtopage'] = true; //打印整个工作表
$param['toptitle'] = 'Demo数据报表';
$str = \ciy\excel::general_excel_xml($param);
$filename = '';
if (empty($filename))
$filename = date('Y-m-d_H-i-s') . rand(1000, 9999);
$filename .= '.xls';
file_put_contents(PATH_WEB . 'ud/tmp/' . $filename, $str);
return succjson(array('url' => '/ud/tmp/' . $filename));
}
}

View File

@ -56,7 +56,7 @@
searchdom: '.search'
, data: json
, liall: '全部'
, lidata: 'cashintype'
, lidata: [{ id: 1, name: '未支付' }, { id: 2, name: '已支付' }]
, liclick: function (dom) {
table.search(dom, 'li');
}

View File

@ -7,8 +7,10 @@ class cash_in {
$query = $post->get('query');
$csql = new \ciy\sql('ap_cash_in');
$liid = objint($query, 'liid');
if ($liid > 0)
$csql->where('cashintype', $liid);
if ($liid == 1)
$csql->where('paytimes=0');
if ($liid == 2)
$csql->where('paytimes>0');
$val = objstr($query, 'vuser');
if (!empty($val)) {
$csqlt = new \ciy\sql('ap_user');

View File

@ -388,7 +388,7 @@ class me {
$param['out_bill_no'] = 'TB' . date('ymd') . '8' . $id;
$param['transfer_scene_id'] = '1005';
$param['openid'] = $rsuser['wxminaid'];
$param['notify_url'] = 'https://expo.ciy.cn/ajax/amb/wxpay.transfer';
$param['notify_url'] = 'https://ciyon.ciy.cn/ajax/ambap/wxpay.transfer';
$param['transfer_remark'] = '佣金奖励';
$param['transfer_amount'] = $cashrow['cashmoney'];
$param['transfer_scene_report_infos'] = array();
@ -617,7 +617,7 @@ class me {
$param = array();
$param['description'] = '购买金币';
$param['out_trade_no'] = 'PT' . date('ymd') . '9' . $orderid;
$param['notify_url'] = 'https://expo.ciy.cn/ajax/amb/wxpay.pay_pnt';
$param['notify_url'] = 'https://ciyon.ciy.cn/ajax/ambap/wxpay.pay_pnt';
$param['amount'] = array();
$param['amount']['total'] = (int)$payprice;
$param['payer'] = array();
@ -705,7 +705,7 @@ class me {
$param = array();
$param['description'] = '购买会员';
$param['out_trade_no'] = 'UB' . date('ymd') . '9' . $orderid;
$param['notify_url'] = 'https://ciyon.ciy.cn/ajax/amb/wxpay.pay_user';
$param['notify_url'] = 'https://ciyon.ciy.cn/ajax/ambap/wxpay.pay_user';
$param['amount'] = array();
$param['amount']['total'] = (int)$money;
$param['payer'] = array();
@ -780,16 +780,82 @@ class me {
$ret['cash'] = $db->get($csql);
return succjson($ret);
}
public static function json_charge_paychk() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
$id = $post->getint('orderid');
for ($i = 0; $i < 10; $i++) {
$csql = new \ciy\sql('ap_cash_in');
$csql->where('id', $id);
$buyrow = $db->getone($csql);
if (!is_array($buyrow))
return errjson('订单不存在');
if ($buyrow['paytimes'] > 0)
return succjson();
sleep(1);
}
return errjson('充值不成功,请联系客服');
}
public static function json_charge_paynow() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
$money = $post->getint('money');
$updata = array();
$updata['name'] = '';
$updata['inmoney'] = $money;
$updata['vuser'] = $rsuser['id'];
$updata['addtimes'] = tostamp();
$updata['paytimes'] = 0;
$csql = new \ciy\sql('ap_cash_in');
if ($db->insert($csql, $updata) === false)
return errjson('订单创建失败:' . $db->error);
$orderid = $db->insert_id();
$param = array();
$param['description'] = '充值';
$param['out_trade_no'] = 'IN' . date('ymd') . '2' . $orderid;
$param['notify_url'] = 'https://ciyon.ciy.cn/ajax/ambap/wxpay.charge';
$param['amount'] = array();
$param['amount']['total'] = (int)$money;
$param['payer'] = array();
$param['payer']['openid'] = $rsuser['wxminaid'];
$wxcfg = gettoken($db, 1);
$wxpay = new \ciy\wxfunc($wxcfg);
$retpay = $wxpay->pay($param);
if (is_string($retpay))
return errjson($retpay);
$retpay['orderid'] = $orderid;
return succjson($retpay);
}
public static function json_cashin_get() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
$query = $post->get('query');
$csql = new \ciy\sql('ap_cash_in');
$csql->where('paytimes>0');
$csql->where('vuser', $rsuser['id']);
$csql->order(objstr($query, 'order', 'id desc'));
$pageno = $post->getint('pageno', 1);
$pagecount = $post->getint('pagecount', 10);
$csql->limit($pageno, $pagecount);
$rows = $db->get($csql);
$ret = array('pageno' => $pageno, 'pagecount' => $pagecount, 'list' => $rows);
return succjson($ret);
}
public static function json_cashie_get() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
$query = $post->get('query');
$csql = new \ciy\sql('ap_cash_ie');
$csql->where('vuser', $rsuser['id']);
$liid = objint($query, 'liid');
if ($liid > 0)
$csql->where('cashtype', $liid);
if ($liid == 1)
$csql->where('cashietype<100');
if ($liid == 2)
$csql->where('cashietype>=100');
$csql->order(objstr($query, 'order', 'id desc'));
$pageno = $post->getint('pageno', 1);
$pagecount = $post->getint('pagecount', 10);

View File

@ -3,7 +3,74 @@
//http://expo.local.ciy.cn/ajax/amb/wxpay.transfer
namespace web\ambap;
class wxpay_pnt {
class wxpay {
public static function json_charge() {
global $db;
$msg = file_get_contents('php://input');
savelogfile('wxpay_charge', '', true);
if (empty($msg))
$msg = '{"id":"601ce864-430c-5dc6-bb14-99ba0e75092a","create_time":"2025-06-18T00:55:47+08:00","resource_type":"encrypt-resource","event_type":"TRANSACTION.SUCCESS","summary":"支付成功","resource":{"original_type":"transaction","algorithm":"AEAD_AES_256_GCM","ciphertext":"tWglulTGTqVaw5FkYXOoAlksz62KOC3726nN0EFkCHXV4mWARk+k5sVhmnglBUG5RO+JLRcADO+xY1fX2kP2wrk7YOAGstM2SQfnoxzlur1HmnWtIamBQ+38UnsH+mi0a4WGMsMDIgqa1YmvklXrlsiS5DXVxYF13tvlXGDeM8atLFprGPs50lSYz6x0XfobMMaiM3S37BE574QDFMTuEaKQkA9P0AkQIQ4LvHTAzg1qZuaJ5uly7Zs+ViMEF9bG7l808cG2/jNtrG8Nu9VD3GyjRTUPX+OnHjWnwuBF+XRpDSLUioophdK0fGvC5Z7wJg1PpJYkTm5m4Fk93i9ao3d8uY7oV8ekQ3GpD+JlJzCoPk30cPC9+UyxiupvvJJK50AzsyXwZ7BU4YIvXEjBUJstcntb5gTFgaICKQCqpIgSKgcrVkDdb8i3IuA17Z1wAJqJQdknx6eLVuelwxbISEtL8v+a9moCjsRPqzJ7HTOkxcujh+SWSftx2f9MEKOxIem1HLr0t4zhVDqwx2Hgnk+YoLdXQ3CdJNXk4435H403gUeNwuAOpemy","associated_data":"transaction","nonce":"Vw6lMyykEja3"}}';
$json = json_decode($msg, true);
if ($json === null)
return self::errlog('回调JSON出错:' . $msg);
if (@$json['event_type'] != 'TRANSACTION.SUCCESS')
return self::errlog('支付失败:' . $msg);
$wxcfg = gettoken($db, 1);
$aesKey = $wxcfg['v3key']; //v3秘钥
$associatedData = $json['resource']['associated_data'];
$nonceStr = $json['resource']['nonce'];
$ciphertext = $json['resource']['ciphertext'];
$dat = \sodium_crypto_aead_aes256gcm_decrypt(base64_decode($ciphertext), $associatedData, $nonceStr, $aesKey);
//clog($dat);
//{"mchid":"1521600371","appid":"wx04060908b8fb3341","out_trade_no":"E2049007187","transaction_id":"4200002494202412238883646214","trade_type":"JSAPI","trade_state":"SUCCESS","trade_state_desc":"支付成功","bank_type":"OTHERS","attach":"87,1,oUlwX5Tv9jYjlENyvCFQtMrmT3Ok","success_time":"2024-12-23T06:44:43+08:00","payer":{"openid":"oUlwX5Tv9jYjlENyvCFQtMrmT3Ok"},"amount":{"total":1,"payer_total":1,"currency":"CNY","payer_currency":"CNY"}}
if ($dat === false)
return self::errlog('解析密文出错:' . $msg);
$json = json_decode($dat, true);
if ($json === null)
return self::errlog('解析密文JSON出错:' . $dat);
if (@$json['trade_state'] != 'SUCCESS')
return self::errlog('支付失败:' . $dat);
$noid = (int)substr($json['out_trade_no'], 9);
$csql = new \ciy\sql('ap_cash_in');
$csql->where('id', $noid);
$orderrow = $db->getone($csql);
if (!is_array($orderrow))
return self::errlog('订单不存在:' . $noid);
$userid = $orderrow['vuser'];
$inmoney = (int)$orderrow['inmoney'];
if ($inmoney != $json['amount']['total'])
return self::errlog('订单金额错误[' . $inmoney . '!=' . $json['amount']['total'] . ']:' . $noid, $userid);
if ($orderrow['paytimes'] > 0) {
savelogfile('wxpay_charge', '已充值[' . $noid . ']');
return succjson();
}
try {
$db->begin();
$updata = array();
$updata['name'] = $json['transaction_id'];
$updata['paytimes'] = tostamp();
$csql = new \ciy\sql('ap_cash_in');
$csql->where('id', $noid);
if ($db->update($csql, $updata) === false)
throw new \Exception('更新ap_cash_in失败:' . $db->error);
//sendusermsg($db, $orderrow['userid'], '集市通知', '买家已付款,请及时处理', '/work/ec/order_detail?id=' . $noid);
$updata = array();
$updata['mycashmoney'] = array('mycashmoney+' . $inmoney);
$csql = new \ciy\sql('ap_user');
$csql->where('id', $userid);
if ($db->update($csql, $updata) === false)
throw new \Exception('更新ap_user失败:' . $db->error);
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
return self::errlog($ex->getMessage(), $userid);
}
savelogfile('wxpay_charge', '成功充值[' . $noid . ']');
return succjson();
}
public static function json_transfer() {
global $db;
$msg = file_get_contents('php://input');
@ -103,7 +170,7 @@ class wxpay_pnt {
if (!is_array($orderrow))
return self::errlog('订单不存在:' . $noid);
$userid = $orderrow['vuser'];
$buypntmoney = (int)($orderrow['buypntmoney']/100);
$buypntmoney = (int)$orderrow['buypntmoney'];
if ($buypntmoney != $json['amount']['total'])
return self::errlog('订单金额错误[' . $buypntmoney . '!=' . $json['amount']['total'] . ']:' . $noid, $userid);
if ($orderrow['paytimes'] > 0) {

View File

@ -1828,22 +1828,16 @@ ciyfn.dropmenu = function (dom) {
var left = domrect.left;
var uldom = $5('ul', dom);
var ulrect = uldom.rect();
var menuwidth = toint(uldom.attr('mewidth'));
if (menuwidth == 0) {
menuwidth = ulrect.width;
uldom.attr('mewidth', menuwidth);
}
uldom.css('inset', null);
var menuwidth = ulrect.width;
var menuheight = ulrect.height;
dom.css('zIndex', 30);
if ($5(document).width() < left + menuwidth) {
left = $5(document).width() - menuwidth;
}
var menuheight = toint(uldom.attr('meheight'));
if (menuheight == 0) {
menuheight = ulrect.height;
uldom.attr('meheight', menuheight);
}
if (left < 0)
left = 0;
if (top + menuheight + 40 < document.documentElement.clientHeight) {
top += domrect.height;
uldom.css({ 'position': 'fixed', 'left': left + 'px', 'top': top + 'px', 'bottom': 'auto' });

View File

@ -1922,7 +1922,6 @@ textarea.tran:focus, select.tran:focus, input.tran:focus {
.ciy-popmenu {
display: none;
position: absolute;
left: 0;
background: var(--bg4);
border: 1px solid var(--bg6);
color: var(--txt7);