首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >用Codebuddy做了几个药店小程序的功能,电子处方,用药安全,药品追溯码

用Codebuddy做了几个药店小程序的功能,电子处方,用药安全,药品追溯码

原创
作者头像
元岳科技
修改2026-08-06 09:18:59
修改2026-08-06 09:18:59
580
举报
文章被收录于专栏:小程序搭建小程序搭建

随着线上售药监管规则持续细化,线上药店小程序不再只是简单的下单工具,电子处方、用药安全确认、药品追溯码是满足药监核查的三大核心基础功能,也是线上经营必备合规模块。

我们在原电子处方的基础上,新增了用药安全日志和本地药品追溯的功能。

一、电子处方闭环功能:规范处方药线上流转

根据《处方药网络零售合规指南》要求,线上售卖处方药必须形成完整审方流程,该模块核心作用是搭建标准化处方留存链路。

使用流程:用户选购处方药后,需完成实名登记,上传复诊处方;系统仅开放执业药师实名账号审核,全程记录操作人、操作时间,日志不可篡改。

代码语言:txt
复制
//创建处方
    public function createRxinfo($tmpId,$name,$phone,$age,$sex){

        $url = $this->url."createRxinfo";

        list($s1, $s2) = explode(' ', microtime());
        $timestamp = (float)sprintf('%.0f',((float)$s1 + (float)$s2) * 1000);

        $disease_json = $this->queryIcdPage();
        $rx_item_json = $this->get_drug();

        $data = [
            "ywid" => "xz".$timestamp,//自定义的id
            "status" => -1,
            "patient_name" => $name,
            "patient_age" => $age,
            "patient_sex" => $sex,
            "patient_phone" => $phone,
            "rx_item_json" => $rx_item_json,
            "disease_json" => $disease_json,
            "timestamp" =>$timestamp,
            "api_code"=>$this->api_code,
            "temp_id"=>$tmpId
        ];


        $sign_str = $this->getSign($data);
        $b_md5 = $sign_str . md5( $this->api_s);
        $api_sign = strtolower( md5($b_md5) );
        $data['api_sign'] = $api_sign;

        $Data = $this->request($url,"POST",$data);
        //var_dump($Data);die;
        $Arr = json_decode($Data,1);
        //var_dump($Arr);

        return $Arr;
    }

风控机制:系统自动拦截重复复用处方、超剂量购药、禁忌药搭配等异常订单,杜绝先购药后补处方的违规行为。

留存规范:问诊记录、处方原件、审方记录自动加密存储,保存周期满足法规 5 年留存要求,监管抽查可一键导出审计台账。

市面上简易线上工具普遍缺少实名留痕、订单熔断机制,一旦核查无法提供完整凭证,极易产生处罚风险。

二、用药安全确认功能:完善线上药学服务凭证

《药品经营质量管理规范》明确,药品销售需留存用药风险告知记录,线上渠道必须设置标准化确认环节。

分层风险提示:系统自动识别药品类目,针对处方药、特殊人群用药,弹窗展示过敏禁忌、肝肾负担、孕期慎用等专业提示。

强制确认机制:用户必须勾选阅读知情同意、确认知晓用药风险,未完成确认无法提交订单,自动留存电子确认凭证。

配套咨询通道:订单页面内置药师咨询入口,购药前后用药沟通记录自动归档,若出现用药不良反应纠纷,可作为门店履行药学服务的有效依据。

传统线上商城仅设置付款流程,缺少该环节会存在民事赔偿与行政处罚双重隐患。

代码语言:txt
复制
   /**
     * 用药安全日志详情
     * 通过 Service.getLogPage 获取数据(含 user/order 关联,含 nickname、phone)
     * @param int $id
     * @return mixed
     */
    public function info($id)
    {
        if (!$id) {
            return app('json')->fail('参数错误');
        }
 
        try {
            // 使用 Service 层 getLogPage + id 搜索器(利用新增 searchIdAttr)获取含关联数据的记录
            $result = $this->service->getLogPage(['id' => (int)$id]);
            $list   = $result['list'] ?? [];
            if (empty($list)) {
                return app('json')->fail('日志不存在');
            }
            $log = is_object($list[0]) ? $list[0]->toArray() : (array)$list[0];
        } catch (\Throwable $e) {
            Log::error('查看用药安全日志详情失败:' . $e->getMessage() . ',id=' . $id);
            return app('json')->fail('查询失败');
        }
 
        // 格式化
        $log['create_time_text'] = isset($log['create_time']) && $log['create_time']
            ? date('Y-m-d H:i:s', (int)$log['create_time'])
            : '—';
        $log['pop_confirm_type_text'] = self::POP_CONFIRM_TYPE_MAP[$log['pop_confirm_type'] ?? 'none'] ?? '无弹窗';
        $log['nickname'] = $log['nickname'] ?? '—';
        $log['phone']    = $log['phone'] ?? '—';
        $log['patient_name'] = $log['patient_name'] ?? '—';
        if ($log['patient_name'] === '—' && !empty($log['patient_id'])) {
            $p = UserInquiry::find((int)$log['patient_id']);
            $log['patient_name'] = $p ? ($p['patient_name'] ?? '—') : '—';
        }
        if ($log['patient_name'] === '—') {
            $log['patient_name'] = $log['order_real_name'] ?? '—';
        }
 
        // 4项安全字段中文标注
        $log['safe_fields_text'] = [];
        foreach (self::SAFE_FIELD_MAP as $field => $label) {
            $log['safe_fields_text'][] = [
                'field' => $field,
                'label' => $label,
                'value' => isset($log[$field]) ? ($log[$field] ? '是' : '否') : '—',
            ];
        }
 
        return app('json')->success($log);
    }

三、国标药品追溯码功能:实现药品一盒一码可查

依据《药品管理法》,药品经营主体需搭建全链路追溯体系,统一采用 Code128-C 20 位标准条码。

代码语言:txt
复制
  // 按商品分组获取可用追溯码,只获取所需数量
        Db::startTrans();
        try {
            $allBoundCodes = [];
 
            foreach ($orderGoods as $product) {
                $productId = $product['product_id'];
                $cartId = $product['cart_id'];
                $needNum = $product['cart_num'] ?? 1;
 
                if ($needNum <= 0) {
                    continue;
                }
 
                // 获取该商品的可用追溯码(在库且未删除),限制数量
                $traceCodes = TraceStock::where('product_id', $productId)
                    ->where('trace_status', TraceStock::TRACE_STATUS_IN_STOCK)
                    ->where('is_deleted', 0)
                    ->limit($needNum)
                    ->select();
 
                if ($traceCodes->isEmpty()) {
                    Log::warning('订单' . $orderId . ' 商品' . $productId . '无可用追溯码库存');
                    continue;
                }
 
                $boundCodes = [];
                foreach ($traceCodes as $code) {
                    $success = TraceStock::lockSale($code['id'], $orderId);
                    if ($success) {
                        $boundCodes[] = $code['id'];
                    }
                }
 
                if (!empty($boundCodes)) {
                    $allBoundCodes = array_merge($allBoundCodes, $boundCodes);
                    $codeIdsStr = implode(',', $boundCodes);
 
                    // 更新该订单明细的追溯码ID字段
                    StoreOrderCartInfo::where('id', $cartId)
                        ->update([
                            'trace_code_ids' => Db::raw("CONCAT(trace_code_ids, '" . $codeIdsStr . "')")
                        ]);
                }
            }
 
            Db::commit();
 
            Log::info('订单' . $orderId . ' 溯源绑定完成,绑定码数:' . count($allBoundCodes));
 
        } catch (\Exception $e) {
            Db::rollback();
            Log::error('订单' . $orderId . ' 溯源绑定事务失败:' . $e->getMessage());
            return false;
        }
 
    } catch (\Throwable $e) {
        Log::error('订单' . $orderId . ' 溯源绑定异常:' . $e->getMessage());
        // 仅记录日志,不阻断订单流程
        return false;
    }
}

商家后台使用逻辑

双录入模式:支持扫码枪批量录入、文本手动导入追溯码,自动匹配对应药品规格;

双重校验规则:录入码数量与订单库存比对,货码不符、库存不足时锁定发货按钮;

商品分类适配:药品强制绑定追溯码,保健品、器械等非药品可跳过录入,提升发货效率。

用户前端查询逻辑

订单详情内置追溯码查看入口,弹窗展示标准条码,支持微信、支付宝扫码,一键调取药品生产、流通、销售全链条信息,满足公众溯源查询法定要求。

四、三大功能整体行业价值

三类模块并非可选增值功能,而是线上药店合规经营刚需。普通 SaaS 工具多简化流程,数据托管第三方平台;

具备完整三大合规模块且支持本地数据存储的小程序,可完整留存处方、用药确认、追溯全部原始数据,避免数据丢失、无法自证合规的经营风险,适配单体药店、连锁药房长期线上运营需求。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档